1 Brief explanation

Every boxplot means a monitoring point (Ponto de monitoramento (or PM) in portuguese). My goal here is to analyze the evolution between decades of each water quality parameter that compounds the Water Quality Index (WQI).

The river flows in the east-west direction as shown in the image below.

The logic behind the sorting in the boxplots is because of 2 main reasons:

  1. The original monitoring point isn’t easy to understand (8 digits, like 87409900)
  2. Changing the original nomenclature to PM1, PM2 (…) makes it easier to understand that the last point has water contributions of every other point upstream.

Some features that I want to add:

  • If the parameter is x, then use x’s classes (with its own classes background color plotted)

  • Define the timescale, should act just like a filter

# plan_wide_19902020 %>%
#   filter(ano_coleta > "1990" &
#          ano_coleta <= "2000")

2 Anotações de coisas por fazer:

  • Descobrir como colocar as estações no sentido correto montante -> jusante nos sumários

87398500, 87398980, 87398900, 87398950, 87405500, 87406900, 87409900

  • Aprender a segmentar o meu dataset por períodos
  • aprender a criar uma nova coluna com a segmentação dos períodos
  • maybe use ~facet.grid
  • aprender a colocar a legenda dentro do gráfico
    • reduzir o tamanho da legenda
  • corrigir os valores 0 de IQA pra NA
  • descobrir como conseguir a equação do lm
  • aprender a pivotar o sumário -> meu sumário do google docs ta batendo direitinho com o do R
  • descobrir se há outros TCCs com disponibilização de códigos
  • Namon tá com com casa decimal "," e ptot tá com "."
  • correlação forte entre condutividade e Namon/Ptot/DBO
1990-2000 2000-2010 2010-2020
1990-2000 2000-2010 2010-2020

3 Instalar os pacotes

# install.packages(tidyverse)

3.1 acessar os pacotes

# library(ggpubr)
pacman::p_load(readr, rmarkdown, readxl, janitor,
               pillar, dplyr, tidyverse,
               # gapminder, 
               knitr, kableExtra, see,
               gridExtra, #modelsummary, 
               gtsummary, ggplot2,
               ggbeeswarm, GGally, ggtext, cowplot,
               report)
# pacman::p_load(tibbletime)
# cite_packages()
knitr::knit_hooks$set(time_it = local({
   now <- NULL
   function(before, options) {
      if (before) {
         # record the current time before each chunk
         now <<- Sys.time()
      } else {
         # calculate the time difference after a chunk
         res <- difftime(Sys.time(), now)
         # return a character string to show the time
         paste("Time for this code chunk to run:", res)
      }
   }
}))

knitr::opts_chunk$set(time_it = TRUE)

3.1.1 referenciando os pacotes

# version$version.string
# citation(package = "tidyverse")

Time for this code chunk to run: 0.00231504440307617

3.2 importando a planilha

Time for this code chunk to run: 1.21519303321838

Time for this code chunk to run: 0.433634042739868

4 data wrangling

Como há dados faltantes, no cálculo entre o produto das colunas, o R acaba interpretando como se fosse zero, mas na verdade é NA.

plan_wide_19902020 <- plan_wide_19902020 %>% 
   mutate(iqa = ifelse(iqa == 0, NA, iqa))

parametros_IQA <- plan_wide_19902020 %>%
  select(
    codigo,
    ponto_monitoramento,
    pH,
    oxigenio_dissolvido,
    dbo,
    fosforo_total,
    escherichia_coli,
    nitrogenio_amoniacal,
    nitrogenio_kjeldahl,
    nitrogenio_total,
    turbidez,
    temperatura_agua,
    solidos_totais,
    condutividade,
    ano_coleta
  )

write.csv(parametros_IQA,
          "./parametros_IQA.csv",
          row.names = FALSE)

plan_wide_19902020 %>% 
  select(starts_with("iqa_")) %>% 
  mutate(
    teste_iqa_calc = prod() #queria tentar gerar o produtório entre as colunas que já possuem o IQA^2
  )
## # A tibble: 1,179 × 18
##    iqa_dbo iqa_p…¹ iqa_n…² iqa_od iqa_pH iqa_t…³ iqa_c…⁴ iqa_s…⁵ iqa_o…⁶ iqa_t…⁷
##      <dbl>   <dbl>   <dbl>  <dbl>  <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
##  1    54.0    72.7    89.0   84.6   89.8    61.9    76.6    83.9    2.13    1.58
##  2    54.0    78.0    87.6   90.9   87.7    61.9    47.2    84.7    2.15    1.58
##  3    29.0    38.3    59.3   76.2   82.9    80.2    60.4    79.4    2.09    1.58
##  4    69.1    77.4    93.7   89.7   77.0    58.7    63.0    85.8    2.15    1.58
##  5    69.1    71.7    88.8   97.5   89.8    63.1    49.7    83.3    2.18    1.58
##  6    78.1    91.2    94.0   89.9   85.4    65.7    57.1    86.1    2.15    1.58
##  7    61.0    63.4    90.4   79.6   82.9    73.6    47.2    86.1    2.10    1.58
##  8    69.1    67.8    89.4   74.4   85.4    59.7    69.8    73.7    2.08    1.58
##  9    61.0    54.3    83.2   76.6   73.6    65.7    63.0    86.0    2.09    1.58
## 10    78.1    78.0    89.6   86.1   92.0    58.7    56.0    83.7    2.13    1.58
## # … with 1,169 more rows, 8 more variables: iqa_coli_2 <dbl>, iqa_pH_2 <dbl>,
## #   iqa_dbo_2 <dbl>, iqa_nitro_tot_2 <dbl>, iqa_ptot_2 <dbl>, iqa_turb_2 <dbl>,
## #   iqa_sol_tot_2 <dbl>, teste_iqa_calc <dbl>, and abbreviated variable names
## #   ¹​iqa_ptot, ²​iqa_nitro_tot, ³​iqa_turb, ⁴​iqa_coli, ⁵​iqa_sol_tot, ⁶​iqa_od_2,
## #   ⁷​iqa_temp_agua

Time for this code chunk to run: 0.362691164016724

Time for this code chunk to run: 0.00242090225219727

Time for this code chunk to run: 0.00496697425842285

5 setting theme

theme_grafs <- function(bg = "white", 
                        coloracao_letra = "black") {
  theme(
    plot.title = 
      element_text(
        hjust = 0.5,
        color = coloracao_letra,
        size = 19),
    
    axis.title.x = 
      # element_text(
      # color = coloracao_letra,
      # size = 15,
      # angle = 0,),
      element_blank(),
    axis.title.y = element_text(
      color = coloracao_letra,
      size = 15,
      angle = 90),
    
    axis.text.x = element_text(
      color = coloracao_letra,
      size = 17),
    axis.text.y = element_text(
      color = coloracao_letra,
      size = 17,
      angle = 0),
    
    strip.background = element_rect(fill = bg,
                                    linetype = 1,
                                    size = 0.5,
                                    color = "black"),
    strip.text = element_text(size = 17),
    panel.background = element_rect(fill = bg),
    plot.background = element_rect(fill = bg),
    plot.margin = margin(l = 5, r = 10,
                         b = 5, t = 5)
  )
}

Time for this code chunk to run: 0.0057380199432373

6 setting different timescales

Time for this code chunk to run: 0.00857710838317871

7 setting sumaries

Time for this code chunk to run: 0.00436186790466309

8 Funções

8.1 criando função para gerar boxplots com percentil 20 e 80

f <- function(x) {
  r <- quantile(x, probs = c(0.05, 0.20, 0.50, 0.80, 0.95))
  names(r) <- c("ymin", "lower", "middle", "upper", "ymax")
  return(r)
}

Time for this code chunk to run: 0.00567889213562012

8.2 criando função para gerar gráfico de od

Time for this code chunk to run: 0.00639009475708008

8.3 criando função para gerar gráfico de dbo

Time for this code chunk to run: 0.00519108772277832

8.4 Ptot

Time for this code chunk to run: 0.00564098358154297

8.5 E coli

Time for this code chunk to run: 0.00552582740783691

8.6 Nitrogênio Amoniacal

boxplot_namon <- function(dados = plan_wide_19902020, eixo_x = codigo, eixo_y = nitrogenio_amoniacal, titulo = "Nitrogênio Amoniacal"){
  ggplot2::ggplot(
    data = dados,
    aes(
      x = {{eixo_x}},
      y = {{eixo_y}}
    )
  )+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=13.3,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3.7,
            ymax=13.3,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=3.7,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_summary(
     fun.data = f,
     geom = 'errorbar',
     width = 0.3,
     position = position_dodge(width = 0.65),
   )+
   stat_summary(
     fun.data = f,
     geom = "boxplot",
     width = 0.7,
     fill = '#F8F8FF',
     color = "black",
     outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
   )+
   # facet_wrap(~periodo)+
   labs(title = titulo,
        x="Estação",
        y="mg/L")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$nitrogenio_amoniacal, na.rm = TRUE),
                                 max(plan_wide_19902020$nitrogenio_amoniacal, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
}

Time for this code chunk to run: 0.00864601135253906

8.7 Turbidez

boxplot_turb <- function(dados = plan_wide_19902020, eixo_x = codigo, eixo_y = turbidez, titulo = "Turbidez"){
  ggplot2::ggplot(
    data = dados,
    aes(
      x = {{eixo_x}},
      y = {{eixo_y}}
    )
  )+
    annotate("rect",
             xmin=-Inf, xmax=Inf,
             ymin=100, ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf, xmax=Inf,
            ymin=40, ymax=100,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf, xmax=Inf,
            ymin=0, ymax=40,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_summary(
     fun.data = f,
     geom = 'errorbar',
     width = 0.3,
     position = position_dodge(width = 0.65),
   )+
   stat_summary(
     fun.data = f,
     geom = "boxplot",
     width = 0.7,
     fill = '#F8F8FF',
     color = "black",
     outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
   )+
   labs(title = titulo,
        x="Estação",
        y="UNT")+
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.05)),
                      n.breaks = 8,
                      limits = c(
                        # 1,
                        min(plan_wide_19902020$turbidez, na.rm = TRUE),
                        # 500
                        max(plan_wide_19902020$turbidez, na.rm = TRUE)
                      ),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
    theme_grafs()
}

Time for this code chunk to run: 0.00695490837097168

8.8 pH

8.9 Sólidos Totais

8.10 Condutividade

9 Parâmetros físico-químicos

9.0.1 Oxigênio Dissolvido

Oxigênio Dissolvido no período 1990-2020Time for this code chunk to run: 3.12685894966125

Oxigênio Dissolvido no período 1990-2000Time for this code chunk to run: 0.739910125732422

Time for this code chunk to run: 0.755051136016846

Time for this code chunk to run: 0.657552003860474

ggsave("od.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = od,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("od_p1.png",
       plot = od_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("od_p2.png",
       plot = od_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("od_p3.png",
       plot = od_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 4.11880302429199

Time for this code chunk to run: 0.716510057449341

Time for this code chunk to run: 0.663861036300659

Time for this code chunk to run: 0.889871120452881

## # A tibble: 9 × 8
##   par       PM1    PM2   PM3   PM4    PM5   PM6    PM7
##   <chr>   <dbl>  <dbl> <dbl> <dbl>  <dbl> <dbl>  <dbl>
## 1 max     10.8   10.5  10.3  12.1  19.9   10.2  11.1  
## 2 p95      9.24   9.8   9.16  9.56  8.92   6.45  8.38 
## 3 p80      7.76   8.3   7.52  8.42  6.2    5.5   5.7  
## 4 median   6.4    6.9   5.95  6.3   4.2    2.6   2.9  
## 5 mean     5.99   6.78  5.98  7.01  4.22   2.98  3.60 
## 6 p20      3.84   5.2   4.3   5.72  0.760  0.2   0.8  
## 7 p05      2      4.3   3.14  4.94  0.28   0.1   0.128
## 8 min      0.8    2     2.5   4.2   0.1    0.1   0.1  
## 9 n      101    101    68    30    97     32    65
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   0.4   3.5   4.9   5.01  6.65  10.9
## 2 87398900   1.9   4     5.5   5.33  6.6   12  
## 3 87398950   1.7   3.2   5.3   5.06  6.18   8.9
## 4 87398980   1.2   3.8   5.6   5.38  6.6    9.2
## 5 87405500   0.2   1.4   2.55  3.28  4     14.2
## 6 87406900   0     1.1   1.9   2.59  3.15  16  
## 7 87409900   0     0.7   2.3   3.12  3.7   10.6
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  0.38 3.11    4.41  4.57  6.2   12.4
## 2 87398900  3.52 5.25    5.96  6.61  7.3   13.8
## 3 87398950  1.62 3.68    4.92  5.28  6.64  11.9
## 4 87398980  3.37 5.5     6.17  6.48  7.14  13.1
## 5 87405500  0.2  1.3     2.53  2.83  3.66   9.8
## 6 87406900  0.1  0.865   2.4   2.43  3.05   9.1
## 7 87409900  0.1  0.92    2.03  2.43  3.5    8.1

Time for this code chunk to run: 0.259079217910767

9.0.2 Demanda Bioquímica de Oxigênio

(dbo <- ggplot(plan_wide_19902020,
               aes(x = codigo,
                   y = dbo))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=10,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=5,
            ymax=10,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3,
            ymax=5,
            alpha=1,
            fill="#70c18c")+ #classe 2
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=3,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_summary(
     fun.data = f,
     geom = 'errorbar',
     width = 0.3,
     position = position_dodge(width = 0.65),
   )+
   stat_summary(
     fun.data = f,
     geom = "boxplot",
     width = 0.7,
     fill = '#F8F8FF',
     color = "black",
     outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
   )+
   facet_wrap(~periodo)+
   labs(title = "Demanda Bioquímica de Oxigênio no período 1990-2020",
        x="Estação",
        y="mg/L",
        # caption = "Leonardo Fernandes Wink"
        )+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                      n.breaks = 8,
                      limits = c(1,100),
                      trans = "log10")+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 60 rows containing non-finite values (`stat_summary()`).
## Removed 60 rows containing non-finite values (`stat_summary()`).
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 22 rows containing missing values.
## Warning: Removed 30 rows containing missing values.
## Warning: Removed 8 rows containing missing values.

Demanda Bioquímica de Oxigênio no período 1990-2020Time for this code chunk to run: 1.66866683959961

Time for this code chunk to run: 0.771039962768555

Time for this code chunk to run: 0.874598026275635

Time for this code chunk to run: 0.757790088653564

Time for this code chunk to run: 0.771016836166382

Time for this code chunk to run: 0.681297063827515

Time for this code chunk to run: 0.64764404296875

(sum_dbo_p1 <- plan_wide_19902020 %>%
   select(codigo, dbo, ano_coleta) %>% 
   filter(ano_coleta>"1990" &
            ano_coleta<="2000") %>% 
   group_by(codigo) %>% 
   summarize(
     min = 
       min(dbo, 
           na.rm = TRUE),
     q1 = 
       quantile(dbo, 0.25, 
                na.rm = TRUE),
     median = 
       median(dbo, 
              na.rm = TRUE),
     mean = 
       mean(dbo, 
            na.rm= TRUE),
     q3 = 
       quantile(dbo, 0.75, 
                na.rm = TRUE),
     max = 
       max(dbo, 
           na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500     1     1      2  1.86   2      13
## 2 87398900     1     1      1  1.52   2       6
## 3 87398950     1     1      1  1.66   2       6
## 4 87398980     1     1      1  1.13   1       2
## 5 87405500     1     2      3  5.37   5      64
## 6 87406900     1     4      5  9     11      26
## 7 87409900     2     3      4  6.97   9.5    31
(sum_dbo_p2 <- plan_wide_19902020 %>%
    select(codigo, dbo, ano_coleta) %>% 
    filter(ano_coleta>"2000" &
             ano_coleta<="2010") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(dbo, 
            na.rm = TRUE),
      q1 = 
        quantile(dbo, 0.25, 
                 na.rm = TRUE),
      median = 
        median(dbo, 
               na.rm = TRUE),
      mean = 
        mean(dbo, 
             na.rm= TRUE),
      q3 = 
        quantile(dbo, 0.75, 
                 na.rm = TRUE),
      max = 
        max(dbo, 
            na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500     1     1      1  1.58   2       5
## 2 87398900     1     1      1  1.40   2       5
## 3 87398950     1     1      1  1.66   2       5
## 4 87398980     1     1      1  1.30   1       5
## 5 87405500     1     2      4  4.67   6.5    14
## 6 87406900     1     3      5  6.53   8      28
## 7 87409900     1     3      6  6.31   9      15
(sum_dbo_p3 <- plan_wide_19902020 %>%
    select(codigo, dbo, ano_coleta) %>% 
    filter(ano_coleta>"2010" &
             ano_coleta<="2020") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(dbo, 
            na.rm = TRUE),
      q1 = 
        quantile(dbo, 0.25, 
                 na.rm = TRUE),
      median = 
        median(dbo, 
               na.rm = TRUE),
      mean = 
        mean(dbo, 
             na.rm= TRUE),
      q3 = 
        quantile(dbo, 0.75, 
                 na.rm = TRUE),
      max = 
        max(dbo, 
            na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500     1     1    1.5  2.15  3        7
## 2 87398900     1     1    1    1.51  2        5
## 3 87398950     1     1    2    2.65  2       18
## 4 87398980     1     1    1    1.32  2        2
## 5 87405500     1     3    4    5.28  6.25    21
## 6 87406900     1     3    5    6.58 10       24
## 7 87409900     1     3    4.5  6.18  8       18

Time for this code chunk to run: 0.253508806228638

ggsave("dbo.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = dbo,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("dbo_p1.png",
       plot = dbo_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("dbo_p2.png",
       plot = dbo_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("dbo_p3.png",
       plot = dbo_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 4.29959893226624

9.0.3 Fósforo total

(ptot <- ggplot(plan_wide_19902020,
                aes(codigo,
                    fosforo_total))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0.15,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0.1,
            ymax=0.15,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=0.1,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
  stat_summary(
     fun.data = f,
     geom = 'errorbar',
     width = 0.3,
     position = position_dodge(width = 0.65),
   )+
   stat_summary(
     fun.data = f,
     geom = "boxplot",
     width = 0.7,
     fill = '#F8F8FF',
     color = "black",
     outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
   )+
  facet_wrap(~periodo)+
    labs(title = "Fósforo total no período 1990-2020",
         x="Estação",
         y="mg/L")+
   scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$fosforo_total, na.rm = TRUE),
                                 max(plan_wide_19902020$fosforo_total), na.rm = TRUE),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " ")
                      )+
    ggbeeswarm::geom_quasirandom(
       size = 1.2,
       alpha = .25,
       width = .07,
    )+
    scale_x_discrete(limits = c("87398500", 
                                "87398980", 
                                "87398900", 
                                "87398950", 
                                "87405500", 
                                "87406900", 
                                "87409900"),
                     labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
    )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 134 rows containing non-finite values (`stat_summary()`).
## Removed 134 rows containing non-finite values (`stat_summary()`).
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 47 rows containing missing values.
## Warning: Removed 31 rows containing missing values.
## Warning: Removed 56 rows containing missing values.

Fósforo total no período 1990-2020Time for this code chunk to run: 1.57841110229492

(ptot_p1<-ggplot(plan_wide_19902020%>% 
                   filter(ano_coleta>"1990" &
                             ano_coleta<="2000"),
                 aes(codigo,
                     fosforo_total))+
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0.15,
             ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0.1,
             ymax=0.15,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=0.1,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Fósforo total no período 1990-2000",
         x="Estação",
         y="mg/L")+
    ggbeeswarm::geom_quasirandom(
       size = 1.2,
       alpha = .25,
       width = .07,
    )+
    scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                       n.breaks = 8,
                       limits = c(min(plan_wide_19902020$fosforo_total, na.rm = TRUE),
                                  max(plan_wide_19902020$fosforo_total), na.rm = TRUE),
                       trans = "log10")+
    scale_x_discrete(limits = c("87398500", 
                                "87398980", 
                                "87398900", 
                                "87398950", 
                                "87405500", 
                                "87406900", 
                                "87409900"),
                     labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
    )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.740449905395508

(ptot_p2 <- ggplot(plan_wide_19902020%>% 
                      filter(ano_coleta>"2000" &
                                ano_coleta<="2010"),
                   aes(codigo,
                       fosforo_total))+
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0.15,
             ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0.1,
             ymax=0.15,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=0.1,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Fósforo total no período 2000-2010",
         x="Estação",
         y="mg/L")+
   scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$fosforo_total, na.rm = TRUE),
                                 max(plan_wide_19902020$fosforo_total), na.rm = TRUE),
                      trans = "log10")+
    ggbeeswarm::geom_quasirandom(
       size = 1.2,
       alpha = .25,
       width = .07,
    )+
    scale_x_discrete(limits = c("87398500", 
                                "87398980", 
                                "87398900", 
                                "87398950", 
                                "87405500", 
                                "87406900", 
                                "87409900"),
                     labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
    )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.779342889785767

(ptot_p3 <- ggplot(plan_wide_19902020%>% 
                      filter(ano_coleta>"2010" &
                                ano_coleta<="2020"),
                   aes(codigo,
                       fosforo_total))+
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0.15,
             ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0.1,
             ymax=0.15,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=0.1,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Fósforo total no período 2010-2020",
         x="Estação",
         y="mg/L")+
    scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                       n.breaks = 8,
                       limits = c(min(plan_wide_19902020$fosforo_total, na.rm = TRUE),
                                  max(plan_wide_19902020$fosforo_total), na.rm = TRUE),
                       trans = "log10")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.707337856292725

(sum_ptot_p1 <- plan_wide_19902020 %>%
    select(codigo, fosforo_total, ano_coleta) %>% 
   filter(ano_coleta>"1990" &
            ano_coleta<="2000") %>% 
   group_by(codigo) %>% 
   summarize(
     min = 
       min(fosforo_total, na.rm = TRUE),
     q1 = 
       quantile(fosforo_total, 0.25, na.rm = TRUE),
     median = 
       median(fosforo_total, na.rm = TRUE),
     mean = 
       mean(fosforo_total, na.rm= TRUE),
     q3 = 
       quantile(fosforo_total, 0.75, na.rm = TRUE),
     max = 
       max(fosforo_total, na.rm = TRUE)))
## # A tibble: 7 × 7
##   codigo      min     q1 median   mean     q3   max
##   <chr>     <dbl>  <dbl>  <dbl>  <dbl>  <dbl> <dbl>
## 1 87398500 0.0097 0.0593 0.0881 0.123  0.14   0.863
## 2 87398900 0.0023 0.0468 0.0678 0.0747 0.0883 0.247
## 3 87398950 0.0202 0.0544 0.0737 0.0751 0.0904 0.179
## 4 87398980 0.01   0.0254 0.0547 0.0708 0.114  0.189
## 5 87405500 0.017  0.171  0.281  0.417  0.492  2.32 
## 6 87406900 0.156  0.270  0.508  0.785  1.07   2.79 
## 7 87409900 0.107  0.258  0.384  0.489  0.712  1.53
(sum_ptot_p2 <- plan_wide_19902020 %>%
    select(codigo, fosforo_total, ano_coleta) %>% 
    filter(ano_coleta>"2000" &
             ano_coleta<="2010") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(fosforo_total, na.rm = TRUE),
      q1 = 
        quantile(fosforo_total, 0.25, na.rm = TRUE),
      median = 
        median(fosforo_total, na.rm = TRUE),
      mean = 
        mean(fosforo_total, na.rm= TRUE),
      q3 = 
        quantile(fosforo_total, 0.75, na.rm = TRUE),
      max = 
        max(fosforo_total, na.rm = TRUE)))
## # A tibble: 7 × 7
##   codigo      min     q1 median  mean    q3   max
##   <chr>     <dbl>  <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500 0.025  0.094   0.131 0.148 0.16  0.637
## 2 87398900 0.015  0.0764  0.104 0.140 0.164 0.646
## 3 87398950 0.036  0.116   0.171 0.180 0.207 0.485
## 4 87398980 0.0115 0.052   0.076 0.101 0.103 1    
## 5 87405500 0.046  0.261   0.406 0.547 0.681 1.98 
## 6 87406900 0.056  0.338   0.599 0.752 0.967 3.49 
## 7 87409900 0.043  0.325   0.624 0.677 0.989 1.57
(sum_ptot_p3 <- plan_wide_19902020 %>%
    select(codigo, fosforo_total, ano_coleta) %>% 
    filter(ano_coleta>"2010" &
             ano_coleta<="2020") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(fosforo_total, na.rm = TRUE),
      q1 = 
        quantile(fosforo_total, 0.25, na.rm = TRUE),
      median = 
        median(fosforo_total, na.rm = TRUE),
      mean = 
        mean(fosforo_total, na.rm= TRUE),
      q3 = 
        quantile(fosforo_total, 0.75, na.rm = TRUE),
      max = 
        max(fosforo_total, na.rm = TRUE)))
## # A tibble: 7 × 7
##   codigo     min     q1 median  mean    q3   max
##   <chr>    <dbl>  <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500 0.061 0.118   0.163 0.166 0.186 0.381
## 2 87398900 0.057 0.0935  0.130 0.163 0.168 0.444
## 3 87398950 0.07  0.132   0.156 0.292 0.221 3.11 
## 4 87398980 0.019 0.0625  0.106 0.144 0.170 0.59 
## 5 87405500 0.013 0.187   0.332 0.361 0.45  0.803
## 6 87406900 0.089 0.254   0.364 0.448 0.560 1.26 
## 7 87409900 0.203 0.259   0.369 0.488 0.564 1.7

Time for this code chunk to run: 0.254715919494629

ggsave("ptot.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = ptot,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ptot_p1.png",
       plot = ptot_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ptot_p2.png",
       plot = ptot_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ptot_p3.png",
       plot = ptot_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 4.63362312316895

9.0.4 Escherichia coli

(ecoli <- boxplot_ecoli(
  titulo = "*Escherichia coli* no período 1990-2020"
)+
  facet_wrap(~periodo)
)

Escherichia-coli-gravataí no período 1990-2020

(ecoli <- ggplot(plan_wide_19902020,
                 aes(codigo,
                     escherichia_coli))+
   annotate("rect",
            xmin=-Inf, xmax=Inf,
            ymin=3200, ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf, xmax=Inf,
            ymin=800, ymax=3200,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf, xmax=Inf,
            ymin=160, ymax=800,
            alpha=1,
            fill="#70c18c")+ #classe 2
   annotate("rect",
            xmin=-Inf, xmax=Inf,
            ymin=0, ymax=160,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_summary(
     fun.data = f,
     geom = 'errorbar',
     width = 0.3,
     position = position_dodge(width = 0.65),
   )+
   stat_summary(
     fun.data = f,
     geom = "boxplot",
     width = 0.7,
     fill = '#F8F8FF',
     color = "black",
     outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
   )+
   facet_wrap(~periodo)+
   labs(title = "*Escherichia coli* no período 1990-2020",
        x="Estação",
        y="NMP/100mL")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      # n.breaks = 9,
                      n.breaks = 6,
                      limits = c(min(plan_wide_19902020$escherichia_coli, na.rm = TRUE),
                                 max(plan_wide_19902020$escherichia_coli, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()+
    theme(
        axis.text.y = element_text(
          angle = 90, 
          # size=15,
          # face=2
        ),
        plot.title = 
          element_markdown(
            hjust = 0.5,
            color = "black",
            size = 19)
    )
)

Escherichia-coli-gravataí no período 1990-2020Time for this code chunk to run: 3.55012106895447

(ecoli_p1 <- ggplot(plan_wide_19902020 %>% 
                       filter(ano_coleta>"1990" &
                                 ano_coleta<="2000"),
                    aes(codigo,
                        escherichia_coli))+
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=3200,
             ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=800,
             ymax=3200,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=160,
             ymax=800,
             alpha=1,
             fill="#70c18c")+ #classe 2
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=160,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Escherichia coli no período 1990-2000",
         x="Estação",
         y="NMP/100mL")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$escherichia_coli, na.rm = TRUE),
                                 max(plan_wide_19902020$escherichia_coli, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
       size = 1.2,
       alpha = .25,
       width = .07,
    )+
    scale_x_discrete(limits = c("87398500", 
                                "87398980", 
                                "87398900", 
                                "87398950", 
                                "87405500", 
                                "87406900", 
                                "87409900"),
                     labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
    )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.889932870864868

(ecoli_p2 <- ggplot(plan_wide_19902020 %>% 
                       filter(ano_coleta>"2000" &
                                 ano_coleta<="2010"),
                    aes(codigo,
                        escherichia_coli))+
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=3200,
             ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=800,
             ymax=3200,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=160,
             ymax=800,
             alpha=1,
             fill="#70c18c")+ #classe 2
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=160,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Escherichia coli no período 2000-2010",
         x="Estação",
         y="NMP/100mL")+
    scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                       n.breaks = 9,
                       limits = c(min(plan_wide_19902020$escherichia_coli, na.rm = TRUE),
                                  max(plan_wide_19902020$escherichia_coli, na.rm = TRUE)),
                       trans = "log10",
                       labels = scales::number_format(accuracy = 1,
                                                      decimal.mark = ",",
                                                      big.mark = " "))+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.830866813659668

(ecoli_p3 <- ggplot(plan_wide_19902020 %>% 
                       filter(ano_coleta>"2010" &
                                 ano_coleta<="2020"),
                    aes(codigo,
                        escherichia_coli))+
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=3200,
             ymax=Inf,
             alpha=1,
             fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=800,
             ymax=3200,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=160,
             ymax=800,
             alpha=1,
             fill="#70c18c")+ #classe 2
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=160,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Escherichia coli no período 2010-2020",
         x="Estação",
         y="NMP/100mL")+
    scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                       n.breaks = 9,
                       limits = c(min(plan_wide_19902020$escherichia_coli, na.rm = TRUE),
                                  max(plan_wide_19902020$escherichia_coli, na.rm = TRUE)),
                       trans = "log10",
                       labels = scales::number_format(accuracy = 1,
                                                      decimal.mark = ",",
                                                      big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 1.1879780292511

(sum_ecoli_p1 <- plan_wide_19902020 %>%
    select(codigo, escherichia_coli, ano_coleta) %>% 
    filter(ano_coleta>"1990" &
              ano_coleta<="2000") %>% 
   group_by(codigo) %>% 
   summarize(
     min = 
       min(escherichia_coli, 
           na.rm = TRUE),
     q1 = 
       quantile(escherichia_coli, 0.25, 
                na.rm = TRUE),
     median = 
       median(escherichia_coli, 
              na.rm = TRUE),
     mean = 
       mean(escherichia_coli, 
            na.rm= TRUE),
     q3 = 
       quantile(escherichia_coli, 0.75, 
                na.rm = TRUE),
     max = 
       max(escherichia_coli, 
           na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median   mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>
## 1 87398500  32   136     240   854.    720 19200
## 2 87398900  16    68     160   548.    480  7760
## 3 87398950   2.4  12.8   268  4039.  10000 28000
## 4 87398980   4   160     243. 2907.    446 25600
## 5 87405500   1.6  12.8    24   545.    128 18400
## 6 87406900  13.6  61.6   192   718.    414 12800
## 7 87409900   2.4  12.8    64    97.7   128   720
(sum_ecoli_p2 <- plan_wide_19902020 %>%
    select(codigo, escherichia_coli, ano_coleta) %>% 
    filter(ano_coleta>"2000" &
             ano_coleta<="2010") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(escherichia_coli, 
            na.rm = TRUE),
      q1 = 
        quantile(escherichia_coli, 0.25, 
                 na.rm = TRUE),
      median = 
        median(escherichia_coli, 
               na.rm = TRUE),
      mean = 
        mean(escherichia_coli, 
             na.rm= TRUE),
      q3 = 
        quantile(escherichia_coli, 0.75, 
                 na.rm = TRUE),
      max = 
        max(escherichia_coli, 
            na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median   mean     q3    max
##   <chr>    <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 87398500  21.6   91    150   1335.   308   27200
## 2 87398900  11     70    133.   444.   414.   2600
## 3 87398950  20    400    720    935.  1120    5500
## 4 87398980  24    110.   195    410.   289.   8800
## 5 87405500   4.7  162   2400  25445. 12950  490000
## 6 87406900   8    172  12800  66370. 62300  650000
## 7 87409900  16   7355. 35500  72440. 68750  460000
(sum_ecoli_p3 <- plan_wide_19902020 %>%
    select(codigo, escherichia_coli, ano_coleta) %>% 
    filter(ano_coleta>"2010" &
             ano_coleta<="2020") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(escherichia_coli, 
            na.rm = TRUE),
      q1 = 
        quantile(escherichia_coli, 0.25, 
                 na.rm = TRUE),
      median = 
        median(escherichia_coli, 
               na.rm = TRUE),
      mean = 
        mean(escherichia_coli, 
             na.rm= TRUE),
      q3 = 
        quantile(escherichia_coli, 0.75, 
                 na.rm = TRUE),
      max = 
        max(escherichia_coli, 
            na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo      min      q1 median    mean      q3      max
##   <chr>     <dbl>   <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
## 1 87398500   90     155.    260     409.    451     2420 
## 2 87398900   10      52.8   107     245.    313     1553.
## 3 87398950  108.    250     487    1424.   1553.   10462 
## 4 87398980   40.8   140.    242.    529.    738.    2400 
## 5 87405500  632    8965   19232. 109992.  70750  1400000 
## 6 87406900 1440   23100   34500  230828. 140500  3400000 
## 7 87409900 2000   20100   38400   83128.  83680   345000

Time for this code chunk to run: 0.24810004234314

ggsave("ecoli.png",
       plot = ecoli,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ecoli_p1.png",
       plot = ecoli_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ecoli_p2.png",
       plot = ecoli_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("ecoli_p3.png",
       plot = ecoli_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 4.2718288898468

9.0.5 Nitrogênio amoniacal

(namon <- plan_wide_19902020 %>% 
  boxplot_namon(
    eixo_y = nitrogenio_amoniacal,
    titulo = "Nitrogênio Amoaniacal no período 1990-2020"
    )+
  facet_wrap(~periodo)
 )

nitrogenio-gravataí no período 1990-2020Time for this code chunk to run: 1.68492484092712

periodo_inicial <- as.Date("1990-01-01", "%Y-%m-%d")
periodo_final <- as.Date("2021-01-01",  "%Y-%m-%d")

(nitro_line <- 
  plan_wide_19902020 %>%
  filter(ano_coleta > "1990" &
           ano_coleta <= "2020") %>%
  dplyr::select(codigo, nitrogenio_amoniacal, data_coleta, periodo) %>%
  # group_by(codigo) %>%
  mutate(
    ponto_monitoramento = case_when(
      codigo == "87398500" ~ "PM1",
      codigo == "87398980" ~ "PM2",
      codigo == "87398900" ~ "PM3",
      codigo == "87398950" ~ "PM4",
      codigo == "87405500" ~ "PM5",
      codigo == "87406900" ~ "PM6",
      codigo == "87409900" ~ "PM7"
    )
  ) %>% 
    # pivot_wider(
    #   names_from = codigo,
    #   values_from = nitro_amon,
    #   id_cols = data_coleta
    # ) %>% 
    ggplot(
      aes(x = data_coleta,
          y = nitrogenio_amoniacal,
          # color = codigo
      ))+
    # geom_rect(
    #   aes(xmin = periodo_inicial, 
    #       xmax = periodo_final,
    #       ymin = 13.3, 
    #       ymax = Inf,
    #       alpha= 0.005,
    #       fill= "#ac5079"),
    # show.legend = FALSE)+ #>pior classe
    # geom_rect(
    #   aes(xmin = periodo_inicial, 
    #       xmax = periodo_final,
  #       ymin= 3.7,
  #       ymax= 13.3,
  #       alpha= 0.005,
  #       fill= "#fcf7ab"),
  #    show.legend = FALSE)+ #classe 3
  # geom_rect(
  #   aes(xmin = periodo_inicial, 
  #       xmax = periodo_final,
  #       ymin= 0,
  #       ymax= 3.7,
  #       alpha= 0.005,
  #       fill= "blue"
  #         # "#8dcdeb"
  #         ),
  #    show.legend = FALSE)+ #classe 1
  annotate("rect",
           xmin= periodo_inicial,
           xmax= periodo_final,
           ymin=13.3,
           ymax=Inf,
           alpha= 0.7,
           fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin= periodo_inicial,
             xmax= periodo_final,
             ymin=3.7,
             ymax=13.3,
             alpha= 0.7,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin= periodo_inicial,
             xmax= periodo_final,
             ymin= -Inf,
             ymax=3.7,
             alpha= 0.7,
             fill="#8dcdeb")+ #classe 1
    geom_line(
      # aes(color = codigo),
      na.rm = TRUE)+
    geom_point(
      # aes(color = codigo),
      na.rm = TRUE)+
    scale_x_date(
      limits = as.Date(c(
        "1990-01-01", 
        "2021-01-01"
        # NA #pode usar NA também
      )),
      expand = c(0.0, 0.0),
      date_breaks = "10 years",
      minor_breaks = "5 years",
      date_labels = "%Y",
    )+
    # geom_smooth(
    #   # aes(color = codigo),
    #   method = "lm",
    #   # formula = y ~ poly(x, 2),
    #   # span = 0.2,
    #   se = TRUE, #se deixar TRUE gera o intervalo de confiança de 95%
    #   aes(group = 1),
    #   alpha =.5,
    #   na.rm = TRUE,
    #   size = 0.3,
    #   # fullrange = TRUE,
  #   # show.legend = TRUE
  # )+
  # stat_smooth(
  #   geom = "smooth",
  #   # span = 0.2,
  #   se = FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
  #   # aes(group = 1),
  #   # alpha =.5,
  #   na.rm = TRUE,
  #   # size = 0.3,
  #   fullrange = TRUE,
  #   show.legend = TRUE
  # )+
  facet_wrap(
    ~ponto_monitoramento,
    nrow = 4,
  )+
    theme_bw()
)

Time for this code chunk to run: 1.26403880119324

(namon_p1 <- ggplot(plan_wide_19902020 %>% 
                      filter(ano_coleta>"1990" &
                               ano_coleta<="2000"),
                    aes(codigo,
                        nitrogenio_amoniacal))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=13.3,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=3.7,
             ymax=13.3,
             alpha=1,
             fill="#fcf7ab")+ #classe 3
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=0,
             ymax=3.7,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
   labs(title = "Nitrogênio amoniacal no período 1990-2000",
        x="Estação",
        y="mg/L")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$nitrogenio_amoniacal, na.rm = TRUE),
                                 max(plan_wide_19902020$nitrogenio_amoniacal, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.758342981338501

(namon_p2 <- ggplot(plan_wide_19902020 %>% 
                      filter(ano_coleta>"2000" &
                               ano_coleta<="2010"),
                    aes(codigo,
                        nitrogenio_amoniacal))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=13.3,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3.7,
            ymax=13.3,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=3.7,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Nitrogênio amoniacal no período 2000-2010",
        x="Estação",
        y="mg/L")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$nitrogenio_amoniacal, na.rm = TRUE),
                                 max(plan_wide_19902020$nitrogenio_amoniacal, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.794203996658325

(namon_p3 <- ggplot(plan_wide_19902020 %>% 
                       filter(ano_coleta>"2010" &
                                 ano_coleta<="2020"),
                    aes(codigo,
                        nitrogenio_amoniacal))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=13.3,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3.7,
            ymax=13.3,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=3.7,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Nitrogênio amoniacal no período 2010-2020",
        x="Estação",
        y="mg/L")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$nitrogenio_amoniacal, na.rm = TRUE),
                                 max(plan_wide_19902020$nitrogenio_amoniacal, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.768031120300293

grid.arrange(namon_p1, namon_p2, namon_p3, ncol = 3)

Time for this code chunk to run: 2.33321499824524

(sum_namon_p1 <- plan_wide_19902020 %>%
   select(codigo, nitrogenio_amoniacal, ano_coleta) %>% 
   filter(ano_coleta>"1990" &
            ano_coleta<="2000") %>% 
   group_by(codigo) %>% 
   summarize(
     min = 
       min(nitrogenio_amoniacal, 
           na.rm = TRUE),
     q1 = 
       quantile(nitrogenio_amoniacal, 0.25, 
                na.rm = TRUE),
     median = 
       median(nitrogenio_amoniacal, 
              na.rm = TRUE),
     mean = 
       mean(nitrogenio_amoniacal, 
            na.rm= TRUE),
     q3 = 
       quantile(nitrogenio_amoniacal, 0.75, 
                na.rm = TRUE),
     max = 
       max(nitrogenio_amoniacal, 
           na.rm = TRUE),
      n = 
       length(nitrogenio_amoniacal)
   )
)
## # A tibble: 7 × 8
##   codigo       min     q1 median    mean     q3     max     n
##   <chr>      <dbl>  <dbl>  <dbl>   <dbl>  <dbl>   <dbl> <int>
## 1 87398500   0.08   0.165  0.205   0.246  0.28     0.91   101
## 2 87398900   0.087  0.17   0.2     0.248  0.242    1.13   101
## 3 87398950 Inf     NA     NA     NaN     NA     -Inf       68
## 4 87398980   0.027  0.12   0.15    0.158  0.188    0.3     30
## 5 87405500   0.43   0.875  1.74    4.28   5.88    17.7     97
## 6 87406900   0.51   1.14   2.78    5.35   7.50    26       32
## 7 87409900 Inf     NA     NA     NaN     NA     -Inf       65
(sum_namon_p2 <- plan_wide_19902020 %>%
    select(codigo, nitrogenio_amoniacal, ano_coleta) %>% 
    filter(ano_coleta>"2000" &
             ano_coleta<="2010") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(nitrogenio_amoniacal, 
            na.rm = TRUE),
      q1 = 
        quantile(nitrogenio_amoniacal, 0.25, 
                 na.rm = TRUE),
      median = 
        median(nitrogenio_amoniacal, 
               na.rm = TRUE),
      mean = 
        mean(nitrogenio_amoniacal, 
             na.rm= TRUE),
      q3 = 
        quantile(nitrogenio_amoniacal, 0.75, 
                 na.rm = TRUE),
      max = 
        max(nitrogenio_amoniacal, 
            na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3    max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl>  <dbl>
## 1 87398500 0.031 0.16   0.21  0.259 0.29   1.22 
## 2 87398900 0.03  0.16   0.21  0.284 0.342  2.77 
## 3 87398950 0.044 0.214  0.276 0.268 0.349  0.413
## 4 87398980 0.024 0.098  0.14  0.161 0.21   0.551
## 5 87405500 0.038 0.79   2.09  3.49  4.54  18    
## 6 87406900 0.03  1.05   2.66  4.27  5.62  19.4  
## 7 87409900 0.453 0.78   2.46  3.84  4.77  16.6
(sum_namon_p3 <- plan_wide_19902020 %>%
    select(codigo, nitrogenio_amoniacal, ano_coleta) %>% 
    filter(ano_coleta>"2010" &
             ano_coleta<="2020") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(nitrogenio_amoniacal, 
            na.rm = TRUE),
      q1 = 
        quantile(nitrogenio_amoniacal, 0.25, 
                 na.rm = TRUE),
      median = 
        median(nitrogenio_amoniacal, 
               na.rm = TRUE),
      mean = 
        mean(nitrogenio_amoniacal, 
             na.rm= TRUE),
      q3 = 
        quantile(nitrogenio_amoniacal, 0.75, 
                 na.rm = TRUE),
      max = 
        max(nitrogenio_amoniacal, 
            na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3    max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl>  <dbl>
## 1 87398500  0.03 0.085  0.1   0.150 0.198  0.419
## 2 87398900  0.03 0.1    0.192 0.213 0.248  0.699
## 3 87398950  0.02 0.165  0.263 0.315 0.4    0.951
## 4 87398980  0.02 0.06   0.1   0.179 0.235  0.717
## 5 87405500  0.05 0.808  1.60  2.55  3.78   9.12 
## 6 87406900  0.03 1.09   2.16  3.61  5.02  21.2  
## 7 87409900  0.04 1.44   2.5   3.40  4.39  18.8

Time for this code chunk to run: 0.327318906784058

ggsave("namon.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = namon,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("namon_p1.png",
       plot = namon_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("namon_p2.png",
       plot = namon_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("namon_p3.png",
       plot = namon_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("namon_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(namon_p1, namon_p2, namon_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 7.71082401275635

9.0.6 Turbidez

(turb <- ggplot(plan_wide_19902020,
                   aes(codigo,
                       turbidez))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=100,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=40,
            ymax=100,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=40,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_summary(
     fun.data = f,
     geom = 'errorbar',
     width = 0.3,
     position = position_dodge(width = 0.65),
   )+
   stat_summary(
     fun.data = f,
     geom = "boxplot",
     width = 0.7,
     fill = '#F8F8FF',
     color = "black",
     outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
   )+
   facet_wrap(~periodo)+
   labs(title = "Turbidez no período 1990-2020",
        x="Estação",
        y="UNT")+
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.05)),
                      n.breaks = 8,
                      limits = c(
                        # 1,
                        min(plan_wide_19902020$turbidez, na.rm = TRUE),
                        # 500
                        max(plan_wide_19902020$turbidez, na.rm = TRUE)
                      ),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

turbidez-gravataí no período 1990-2020Time for this code chunk to run: 1.50802898406982

(turb_line <- plan_wide_19902020 %>%
  filter(ano_coleta > "1990" &
           ano_coleta <= "2020") %>%
  select(codigo, turbidez, data_coleta, periodo) %>%
  group_by(codigo) %>%
  ggplot(
    aes(x = data_coleta,
        y = turbidez,
        color = codigo
    ))+
    geom_line(
      # aes(color = codigo),
      na.rm = TRUE)+
    geom_point(
      # aes(color = codigo),
      na.rm = TRUE)+
    scale_x_date(
      limits = as.Date(c(
        "1990-01-01", 
        "2021-01-01"
        # NA #pode usar NA também
      )),
      expand = c(0.0, 0.0),
      date_breaks = "10 years",
      minor_breaks = "5 years",
      date_labels = "%Y",
    )+
  # geom_smooth(
  #   # aes(color = codigo),
  #   method = "lm",
  #   # formula = y ~ poly(x, 2),
  #   # span = 0.2,
  #   se = TRUE, #se deixar TRUE gera o intervalo de confiança de 95%
  #   aes(group = 1),
  #   alpha =.5,
  #   na.rm = TRUE,
  #   size = 0.3,
  #   # fullrange = TRUE,
  #   # show.legend = TRUE
  # )+
  # stat_smooth(
  #   geom = "smooth",
  #   # span = 0.2,
  #   se = FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
  #   # aes(group = 1),
  #   # alpha =.5,
  #   na.rm = TRUE,
  #   # size = 0.3,
  #   fullrange = TRUE,
  #   show.legend = TRUE
  # )+
  facet_wrap(
    ~codigo,
    nrow = 4,
  )+
  theme_bw()
)

Time for this code chunk to run: 1.31414103507996

(turb_p1 <- ggplot(plan_wide_19902020 %>% 
                     filter(ano_coleta>"1990" &
                              ano_coleta<="2000"),
                   aes(codigo,
                       turbidez))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=100,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=40,
            ymax=100,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=40,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Turbidez no período 1990-2000",
        x="Estação",
        y="UNT")+
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$turbidez, na.rm = TRUE),
                                 max(plan_wide_19902020$turbidez, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.923189163208008

(turb_p2 <- ggplot(plan_wide_19902020 %>% 
                     filter(ano_coleta>"2000" &
                              ano_coleta<="2010"),
                   aes(codigo,
                       turbidez))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=100,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=40,
            ymax=100,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=40,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Turbidez no período 2000-2010",
        x="Estação",
        y="UNT")+
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$turbidez, na.rm = TRUE),
                                 max(plan_wide_19902020$turbidez, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.764994859695435

(turb_p3 <- ggplot(plan_wide_19902020 %>% 
                     filter(ano_coleta>"2010" &
                              ano_coleta<="2020"),
                   aes(codigo,
                       turbidez))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=100,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=40,
            ymax=100,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=40,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Turbidez no período 2010-2020",
        x="Estação",
        y="UNT")+
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$turbidez, na.rm = TRUE),
                                 max(plan_wide_19902020$turbidez, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.734085083007812

grid.arrange(turb_p1, turb_p2, turb_p3, ncol = 3)

Time for this code chunk to run: 2.32150292396545

(sum_turb_p1 <- plan_wide_19902020 %>%
   select(codigo, turbidez, ano_coleta) %>% 
   filter(ano_coleta>"1990" &
            ano_coleta<="2000") %>% 
   group_by(codigo) %>% 
   summarize(
     min = 
       min(turbidez, 
           na.rm = TRUE),
     q1 = 
       quantile(turbidez, 0.25, 
                na.rm = TRUE),
     median = 
       median(turbidez, 
              na.rm = TRUE),
     mean = 
       mean(turbidez, 
            na.rm= TRUE),
     q3 = 
       quantile(turbidez, 0.75, 
                na.rm = TRUE),
     max = 
       max(turbidez, 
           na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   6.2  19     34.5  63.5  67     461
## 2 87398900   9    19     49.5  61.5  73.8   460
## 3 87398950   9.6  16     22    33.3  48.8   144
## 4 87398980  16    32.8   43    66.8  90.5   190
## 5 87405500   8.5  23.5   47    47.5  58     159
## 6 87406900  33    54.8   67    77.7  81.5   199
## 7 87409900   5.8  15     25    32.2  48      76
(sum_turb_p2 <- plan_wide_19902020 %>%
    select(codigo, turbidez, ano_coleta) %>% 
    filter(ano_coleta>"2000" &
             ano_coleta<="2010") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(turbidez, 
            na.rm = TRUE),
      q1 = 
        quantile(turbidez, 0.25, 
                 na.rm = TRUE),
      median = 
        median(turbidez, 
               na.rm = TRUE),
      mean = 
        mean(turbidez, 
             na.rm= TRUE),
      q3 = 
        quantile(turbidez, 0.75, 
                 na.rm = TRUE),
      max = 
        max(turbidez, 
            na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500     9  41.2   55.5  71.1  74.2   428
## 2 87398900    39  57     78   107.  116.    475
## 3 87398950    39  47     64    96.5  90     330
## 4 87398980    24  37     50    64.5  87     176
## 5 87405500    32  46     63.5  70.3  76     341
## 6 87406900    35  49     62    69.9  75.5   284
## 7 87409900    40  45     60    70.4  90     151
(sum_turb_p3 <- plan_wide_19902020 %>%
    select(codigo, turbidez, ano_coleta) %>% 
    filter(ano_coleta>"2010" &
             ano_coleta<="2020") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(turbidez, 
            na.rm = TRUE),
      q1 = 
        quantile(turbidez, 0.25, 
                 na.rm = TRUE),
      median = 
        median(turbidez, 
               na.rm = TRUE),
      mean = 
        mean(turbidez, 
             na.rm= TRUE),
      q3 = 
        quantile(turbidez, 0.75, 
                 na.rm = TRUE),
      max = 
        max(turbidez, 
            na.rm = TRUE))
) 
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  8.52  16.4   29    33.3  43     85 
## 2 87398900 14.8   39.2   48.3  66.7  73.4  299 
## 3 87398950 16     29.9   41    51.6  65    230 
## 4 87398980 11     19.4   33.6  39.5  42.2  110.
## 5 87405500 10.0   29.0   41    42.9  54.5  131 
## 6 87406900  9.62  23     39    41.2  52    122 
## 7 87409900  9.68  22.0   34.0  40.5  47    182.

Time for this code chunk to run: 0.360772132873535

ggsave("turb.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = turb,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("turb_p1.png",
       plot = turb_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("turb_p2.png",
       plot = turb_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("turb_p3.png",
       plot = turb_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("turb_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(turb_p1, turb_p2, turb_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 8.09145998954773

9.0.7 pH

(pH <- ggplot(plan_wide_19902020,
                 aes(codigo,
                     pH))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=6,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=9,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=6,
            ymax=9,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_summary(
     fun.data = f,
     geom = 'errorbar',
     width = 0.3,
     position = position_dodge(width = 0.65),
   )+
   stat_summary(
     fun.data = f,
     geom = "boxplot",
     width = 0.7,
     fill = '#F8F8FF',
     color = "black",
     outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
   )+
   facet_wrap(~periodo)+
   labs(title = "pH no período 1990-2020",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 8,
                      limits = c(4,11),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

pH-gravataí no período 1990-2020Time for this code chunk to run: 2.29897689819336

(pH_p1 <- ggplot(plan_wide_19902020 %>% 
                   filter(ano_coleta>"1990" &
                            ano_coleta<="2000"),
                 aes(codigo,
                     pH))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=6,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=9,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=6,
            ymax=9,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "pH no período 1990-2000",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 8,
                      limits = c(4,11),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.825370073318481

(pH_p2 <- ggplot(plan_wide_19902020 %>% 
                   filter(ano_coleta>"2000" &
                            ano_coleta<="2010"),
                 aes(codigo,
                     pH))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=6,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=9,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=6,
            ymax=9,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "pH no período 2000-2010",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 8,
                      limits = c(4,11),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.700754880905151

(pH_p3 <- ggplot(plan_wide_19902020 %>% 
                   filter(ano_coleta>"2010" &
                            ano_coleta<="2020"),
                 aes(codigo,
                     pH))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=6,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=9,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=6,
            ymax=9,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "pH no período 2010-2020",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 8,
                      limits = c(4,11),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.680684089660645

grid.arrange(pH_p1, pH_p2, pH_p3, ncol = 3)

Time for this code chunk to run: 2.04337596893311

(sum_pH_p1 <- plan_wide_19902020 %>%
   select(codigo, pH, ano_coleta) %>% 
   filter(ano_coleta>"1990" &
            ano_coleta<="2000") %>% 
   group_by(codigo) %>% 
   summarize(
     min = 
       min(pH, 
           na.rm = TRUE),
     q1 = 
       quantile(pH, 0.25, 
                na.rm = TRUE),
     median = 
       median(pH, 
              na.rm = TRUE),
     mean = 
       mean(pH, 
            na.rm= TRUE),
     q3 = 
       quantile(pH, 0.75, 
                na.rm = TRUE),
     max = 
       max(pH, 
           na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   5    6.18   6.59  6.51  6.82   7.9
## 2 87398900   5.2  6      6.3   6.33  6.63   7.9
## 3 87398950   5.4  6.29   6.4   6.49  6.72   8.1
## 4 87398980   5.3  5.93   6.2   6.16  6.3    7.3
## 5 87405500   5    6.3    6.4   6.47  6.7    9.3
## 6 87406900   5.5  6.18   6.45  6.43  6.8    7.3
## 7 87409900   4.5  6.2    6.4   6.44  6.7    7.4
(sum_pH_p2 <- plan_wide_19902020 %>%
    select(codigo, pH, ano_coleta) %>% 
    filter(ano_coleta>"2000" &
             ano_coleta<="2010") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(pH, 
            na.rm = TRUE),
      q1 = 
        quantile(pH, 0.25, 
                 na.rm = TRUE),
      median = 
        median(pH, 
               na.rm = TRUE),
      mean = 
        mean(pH, 
             na.rm= TRUE),
      q3 = 
        quantile(pH, 0.75, 
                 na.rm = TRUE),
      max = 
        max(pH, 
            na.rm = TRUE))
) 
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   5.3   6.3   6.6   6.59  6.88   7.9
## 2 87398900   5.5   6.4   6.65  6.63  6.9    7.5
## 3 87398950   6     6.6   6.8   6.89  7.25   7.6
## 4 87398980   5.8   6.3   6.5   6.63  7      7.5
## 5 87405500   5.2   6.4   6.6   6.68  6.9    8.3
## 6 87406900   5.5   6.4   6.7   6.66  6.9    8.6
## 7 87409900   5.8   6.5   6.8   6.77  7      8.4
(sum_pH_p3 <- plan_wide_19902020 %>%
    select(codigo, pH, ano_coleta) %>% 
    filter(ano_coleta>"2010" &
             ano_coleta<="2020") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(pH, 
            na.rm = TRUE),
      q1 = 
        quantile(pH, 0.25, 
                 na.rm = TRUE),
      median = 
        median(pH, 
               na.rm = TRUE),
      mean = 
        mean(pH, 
             na.rm= TRUE),
      q3 = 
        quantile(pH, 0.75, 
                 na.rm = TRUE),
      max = 
        max(pH, 
            na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  5.47  6.28   6.42  6.47  6.60  7.3 
## 2 87398900  5.68  6.36   6.5   6.57  6.84  7.4 
## 3 87398950  5.71  6.28   6.46  6.46  6.68  7   
## 4 87398980  5.42  6.10   6.36  6.39  6.6   7.2 
## 5 87405500  5.64  6.34   6.5   6.49  6.7   7.01
## 6 87406900  5.6   6.4    6.48  6.51  6.77  7.3 
## 7 87409900  5.59  6.46   6.6   6.57  6.76  7.2

Time for this code chunk to run: 0.251217126846313

ggsave("pH.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = pH,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("pH_p1.png",
       plot = pH_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("pH_p2.png",
       plot = pH_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("pH_p3.png",
       plot = pH_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("pH_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(pH_p1, pH_p2, pH_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 7.51497602462769

9.0.8 Sólidos totais

(SolTot <- ggplot(plan_wide_19902020,
                  aes(codigo,
                      solidos_totais))+
   annotate("rect",
            xmin = -Inf, xmax = Inf,
            ymin = 500, ymax = Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_summary(
     fun.data = f,
     geom = 'errorbar',
     width = 0.3,
     position = position_dodge(width = 0.65),
   )+
   stat_summary(
     fun.data = f,
     geom = "boxplot",
     width = 0.7,
     fill = '#F8F8FF',
     color = "black",
     outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
   )+
   facet_wrap(~periodo)+
   labs(title = "Sólidos totais no período 1990-2020",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$solidos_totais, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

sólidos-totais-gravataí no período 1990-2020Time for this code chunk to run: 1.84275102615356

(SolTot_p1 <- ggplot(plan_wide_19902020 %>% 
                       filter(ano_coleta>"1990" &
                                ano_coleta<="2000"),
                     aes(codigo,
                         solidos_totais))+
   annotate("rect",
            xmin = -Inf, xmax = Inf,
            ymin = 500, ymax = Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Sólidos totais no período 1990-2000",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$solidos_totais, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.935385227203369

(SolTot_p2 <- ggplot(plan_wide_19902020 %>% 
                       filter(ano_coleta>"2000" &
                                ano_coleta<="2010"),
                     aes(codigo,
                         solidos_totais))+
   annotate("rect",
            xmin = -Inf, xmax = Inf,
            ymin = 500, ymax = Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Sólidos totais no período 2000-2010",
        x="Estação",
        y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$solidos_totais, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
       size = 1.2,
       alpha = .25,
       width = .07,
    )+
    scale_x_discrete(limits = c("87398500", 
                                "87398980", 
                                "87398900", 
                                "87398950", 
                                "87405500", 
                                "87406900", 
                                "87409900"),
                     labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
    )+
    geom_smooth(method = "lm",
                se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
                aes(group=1),
                alpha=.5,
                na.rm = TRUE,
                size = 1)+
    theme_grafs()
)

Time for this code chunk to run: 0.963917016983032

(SolTot_p3 <- ggplot(plan_wide_19902020 %>% 
                        filter(ano_coleta>"2010" &
                                  ano_coleta<="2020"),
                     aes(codigo,
                         solidos_totais))+
    annotate("rect",
            xmin = -Inf, xmax = Inf,
            ymin = 500, ymax = Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
    annotate("rect",
             xmin=-Inf,
             xmax=Inf,
             ymin=-Inf,
             ymax=500,
             alpha=1,
             fill="#8dcdeb")+ #classe 1
    stat_boxplot(geom = 'errorbar',
                 width=0.3,
                 position = position_dodge(width = 0.65))+
    geom_boxplot(fill='#F8F8FF',
                 color="black",
                 outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                 width= 0.7)+
    labs(title = "Sólidos totais no período 2010-2020",
         x="Estação",
         y="")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$solidos_totais, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.909337997436523

grid.arrange(SolTot_p1, SolTot_p2, SolTot_p3, ncol = 3)

Time for this code chunk to run: 2.60734796524048

(sum_SolTot_p1 <- plan_wide_19902020 %>%
   select(codigo, solidos_totais, ano_coleta) %>% 
   filter(ano_coleta>"1990" &
            ano_coleta<="2000") %>% 
   group_by(codigo) %>% 
   summarize(
     min = 
       min(solidos_totais, 
           na.rm = TRUE),
     q1 = 
       quantile(solidos_totais, 0.25, 
                na.rm = TRUE),
     median = 
       median(solidos_totais, 
              na.rm = TRUE),
     mean = 
       mean(solidos_totais, 
            na.rm= TRUE),
     q3 = 
       quantile(solidos_totais, 0.75, 
                na.rm = TRUE),
     max = 
       max(solidos_totais, 
           na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500    46  84.5   95   122.   120    510
## 2 87398900    18  74.5   97   111.   122.   474
## 3 87398950    10  76.5   91    90.9  106.   155
## 4 87398980    48  63.5   81.5 104.   126.   337
## 5 87405500    70 101    121   133.   151    361
## 6 87406900    89 118    155   165.   210    279
## 7 87409900    20  99.5  122   128.   143    381
(sum_SolTot_p2 <- plan_wide_19902020 %>%
    select(codigo, solidos_totais, ano_coleta) %>% 
    filter(ano_coleta>"2000" &
             ano_coleta<="2010") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(solidos_totais, 
            na.rm = TRUE),
      q1 = 
        quantile(solidos_totais, 0.25, 
                 na.rm = TRUE),
      median = 
        median(solidos_totais, 
               na.rm = TRUE),
      mean = 
        mean(solidos_totais, 
             na.rm= TRUE),
      q3 = 
        quantile(solidos_totais, 0.75, 
                 na.rm = TRUE),
      max = 
        max(solidos_totais, 
            na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500    28  80     100  111.   123.   412
## 2 87398900    42  82     102. 128.   140.   489
## 3 87398950    46  94.2   108. 126.   127.   318
## 4 87398980    40  61      77   85.3   96    228
## 5 87405500    48 102     133  148.   170.   522
## 6 87406900    50 109     134. 154.   170.   670
## 7 87409900    56 112.    156  167.   190.   599
(sum_SolTot_p3 <- plan_wide_19902020 %>%
    select(codigo, solidos_totais, ano_coleta) %>% 
    filter(ano_coleta>"2010" &
             ano_coleta<="2020") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(solidos_totais, 
            na.rm = TRUE),
      q1 = 
        quantile(solidos_totais, 0.25, 
                 na.rm = TRUE),
      median = 
        median(solidos_totais, 
               na.rm = TRUE),
      mean = 
        mean(solidos_totais, 
             na.rm= TRUE),
      q3 = 
        quantile(solidos_totais, 0.75, 
                 na.rm = TRUE),
      max = 
        max(solidos_totais, 
            na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500    61  69      90   82.8   96    101
## 2 87398900    41  77     104  120.   127    308
## 3 87398950    45  93     101  109.   117    221
## 4 87398980    55  62.8    80   79.9   95    109
## 5 87405500    83  89.2   108. 124.   162.   195
## 6 87406900    50 106     117  135.   163    246
## 7 87409900    75 103     115  131.   145    251

Time for this code chunk to run: 0.324244976043701

ggsave("SolTot.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = SolTot,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("SolTot_p1.png",
       plot = SolTot_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("SolTot_p2.png",
       plot = SolTot_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("SolTot_p3.png",
       plot = SolTot_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("SolTot_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(SolTot_p1, SolTot_p2, SolTot_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 6.9107129573822

9.0.9 IQA

iqa-gravataí no período 1990-2020Time for this code chunk to run: 1.27456784248352

Time for this code chunk to run: 0.590227127075195

Time for this code chunk to run: 0.628800868988037

Time for this code chunk to run: 0.537429094314575

grid.arrange(iqa_p1, iqa_p2, iqa_p3, ncol = 3)

Time for this code chunk to run: 1.61882710456848

(sum_IQA_p1 <- plan_wide_19902020 %>%
   select(codigo, iqa, ano_coleta) %>% 
   filter(ano_coleta>"1990" &
            ano_coleta<="2000") %>% 
   group_by(codigo) %>% 
   summarize(
     min = 
       min(iqa, 
           na.rm = TRUE),
     q1 = 
       quantile(iqa, 0.25, 
                na.rm = TRUE),
     median = 
       median(iqa, 
              na.rm = TRUE),
     mean = 
       mean(iqa, 
            na.rm= TRUE),
     q3 = 
       quantile(iqa, 0.75, 
                na.rm = TRUE),
     max = 
       max(iqa, 
           na.rm = TRUE),
     n = 
        length(iqa)
   )
)
## # A tibble: 7 × 8
##   codigo     min    q1 median  mean    q3   max     n
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <int>
## 1 87398500  27.0  35.7   40.9  40.7  46.2  52.2   101
## 2 87398900  27.8  37.9   42.9  43.0  48.0  58.5   101
## 3 87398950  32.8  36.8   41.4  43.2  48.6  61.9    68
## 4 87398980  29.2  35.8   40.4  40.3  44.8  51.9    30
## 5 87405500  24.8  34.9   41.2  40.3  46.9  57.6    97
## 6 87406900  24.7  31.3   37.8  37.4  44.4  49.0    32
## 7 87409900  23.6  31.9   37.1  38.8  46.2  55.4    65
(sum_IQA_p2 <- plan_wide_19902020 %>%
    select(codigo, iqa, ano_coleta) %>% 
    filter(ano_coleta>"2000" &
             ano_coleta<="2010") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(iqa, 
            na.rm = TRUE),
      q1 = 
        quantile(iqa, 0.25, 
                 na.rm = TRUE),
      median = 
        median(iqa, 
               na.rm = TRUE),
      mean = 
        mean(iqa, 
             na.rm= TRUE),
      q3 = 
        quantile(iqa, 0.75, 
                 na.rm = TRUE),
      max = 
        max(iqa, 
            na.rm = TRUE),
      n = 
        length(iqa)
      )
)
## # A tibble: 7 × 8
##   codigo     min    q1 median  mean    q3   max     n
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <int>
## 1 87398500  27.8  34.6   40.0  39.5  43.5  48.7    75
## 2 87398900  28.5  35.1   37.6  38.3  40.6  48.5    77
## 3 87398950  21.1  29.4   32.7  32.8  36.8  44.0    30
## 4 87398980  24.5  35.7   39.4  39.5  43.4  52.1    66
## 5 87405500  19.8  28.7   31.5  31.9  35.7  48.8    78
## 6 87406900  17.1  25.3   29.0  29.5  32.8  44.1    79
## 7 87409900  16.2  20.5   26.1  25.0  29.8  33.1    31
(sum_IQA_p3 <- plan_wide_19902020 %>%
    select(codigo, iqa, ano_coleta) %>% 
    filter(ano_coleta>"2010" &
             ano_coleta<="2020") %>%
    # ?as_factor(codigo) %>% 
    group_by(codigo) %>%
    summarize(
      min = 
        min(iqa, 
            na.rm = TRUE),
      q1 = 
        quantile(iqa, 0.25, 
                 na.rm = TRUE),
      median = 
        median(iqa, 
               na.rm = TRUE),
      mean = 
        mean(iqa, 
             na.rm= TRUE),
      q3 = 
        quantile(iqa, 0.75, 
                 na.rm = TRUE),
      max = 
        max(iqa, 
            na.rm = TRUE),
      n = 
        length(iqa),
      NAs = 
        sum(is.na(iqa))
      ) %>% 
  mutate(
    "%NA" = NAs/n*100
  )
)
## # A tibble: 7 × 10
##   codigo     min    q1 median  mean    q3   max     n   NAs `%NA`
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <int> <int> <dbl>
## 1 87398500  40.2  42.5   45.4  44.2  45.5  47.2    34    29  85.3
## 2 87398900  34.1  38.6   41.2  40.2  42.9  44.4    36    32  88.9
## 3 87398950  36.7  39.5   42.4  41.5  44.4  44.6    35    31  88.6
## 4 87398980  40.0  40.0   40.0  40.0  40.0  40.0    28    27  96.4
## 5 87405500  30.8  31.6   32.5  32.5  33.3  34.1    33    31  93.9
## 6 87406900  22.9  24.4   25.9  25.3  26.5  27.2    35    32  91.4
## 7 87409900  24.1  25.1   27.3  26.9  28.2  29.7    37    32  86.5

Time for this code chunk to run: 0.249190807342529

ggsave("iqa.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = iqa,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("iqa_p1.png",
       plot = iqa_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("iqa_p2.png",
       plot = iqa_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("iqa_p3.png",
       plot = iqa_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("iqa_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(iqa_p1, iqa_p2, iqa_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 6.1524019241333

9.1 Testando coisas

9.1.1 Correlação

parametros_IQA %>% 
  dplyr::select(
    -codigo,
    -ano_coleta,
    -nitrogenio_total
    ) %>% 
  # group_by(codigo) %>% 
  rename(
    
    CE = condutividade,
    E_coli = escherichia_coli,
    OD = oxigenio_dissolvido,
    ST = solidos_totais,
    Turb = turbidez,
    Temp = temperatura_agua,
    Ptot = fosforo_total,
    # NTot = nitrogenio_total,
    NAmon = nitrogenio_amoniacal,
    NTK = nitrogenio_kjeldahl
  ) %>% 
  ggcorr(
    method = "complete.obs",
    # "pearson",
    # "pairwise",
    name = "Correlação",
    label = TRUE,
    label_alpha = TRUE,
    digits = 3,
    low = "#3B9AB2",
    mid = "#EEEEEE",
    high = "#F21A00",
    # palette = "RdYlBu",
    layout.exp = 0,
    legend.position = "left",
    label_round = 3,
    # legend.size = 18,
    geom = "tile",
    nbreaks = 10,
  )+
  labs(title = "Correlação entre parâmetros físico-químicos na\nBacia Hidrográfica do rio Gravataí no período 1990-2020")+
  theme_linedraw()+
  theme(
    legend.position = c(0.15, 0.6),
    legend.title = element_text(size = 16),
    legend.text = element_text(size = 14),
    # legend.spacing = unit(element_text(),
                          # units = 5)
    plot.title = element_text(hjust = 0.5,
                              size = 16)
  )

correlação-parametros-qualidade-agua-gravataí no período 1990-2020

# Gráfico das correlações entre todos os parâmetros com significância
correl_IQA <- parametros_IQA %>%
  dplyr::select(-codigo) %>%
  ggpairs(title = "Correlação entre parâmetros que compõem o IQA",
          axisLabels = "show")

correlacao_pIQA <- parametros_IQA %>% 
  group_by(codigo) %>% 
  correlation::correlation()

correlacao_pIQA %>% 
  # glimpse()
  filter(
    p < 0.001
  ) %>% 
  t() %>% 
  summary()
##  87398500 - oxigenio_dissolvido 87398500 - dbo   87398500 - fosforo_total
##  Min.   :-0.4765                Min.   :0.4176   Min.   :0.3641          
##  1st Qu.: 1.0000                1st Qu.:1.0000   1st Qu.:1.0000          
##  Median : 1.0000                Median :1.0000   Median :1.0000          
##  Mean   : 0.7836                Mean   :0.9552   Mean   :0.8668          
##  3rd Qu.: 1.0000                3rd Qu.:1.0000   3rd Qu.:1.0000          
##  Max.   : 1.0000                Max.   :1.0000   Max.   :1.0000          
##  87398500 - nitrogenio_kjeldahl 87398500 - nitrogenio_total 87398500 - turbidez
##  Min.   :0.4105                 Min.   :0.4915              Min.   :0.3641     
##  1st Qu.:0.7854                 1st Qu.:1.0000              1st Qu.:1.0000     
##  Median :1.0000                 Median :1.0000              Median :1.0000     
##  Mean   :0.8634                 Mean   :0.9609              Mean   :0.9133     
##  3rd Qu.:1.0000                 3rd Qu.:1.0000              3rd Qu.:1.0000     
##  Max.   :1.0000                 Max.   :1.0000              Max.   :1.0000     
##  87398500 - nitrogenio_amoniacal 87398500 - pH 87398500 - temperatura_agua
##  Min.   :1                       Min.   :1     Min.   :-0.4765            
##  1st Qu.:1                       1st Qu.:1     1st Qu.: 1.0000            
##  Median :1                       Median :1     Median : 1.0000            
##  Mean   :1                       Mean   :1     Mean   : 0.8864            
##  3rd Qu.:1                       3rd Qu.:1     3rd Qu.: 1.0000            
##  Max.   :1                       Max.   :1     Max.   : 1.0000            
##  87398500 - solidos_totais 87398500 - escherichia_coli 87398500 - ano_coleta
##  Min.   :0.4915            Min.   :1                   Min.   :-0.3361      
##  1st Qu.:0.8978            1st Qu.:1                   1st Qu.: 1.0000      
##  Median :1.0000            Median :1                   Median : 1.0000      
##  Mean   :0.8976            Mean   :1                   Mean   : 0.8972      
##  3rd Qu.:1.0000            3rd Qu.:1                   3rd Qu.: 1.0000      
##  Max.   :1.0000            Max.   :1                   Max.   : 1.0000      
##  87398500 - condutividade 87398900 - oxigenio_dissolvido 87398900 - dbo  
##  Min.   :1                Min.   :-0.3893                Min.   :0.3880  
##  1st Qu.:1                1st Qu.: 1.0000                1st Qu.:1.0000  
##  Median :1                Median : 1.0000                Median :1.0000  
##  Mean   :1                Mean   : 0.8931                Mean   :0.9529  
##  3rd Qu.:1                3rd Qu.: 1.0000                3rd Qu.:1.0000  
##  Max.   :1                Max.   : 1.0000                Max.   :1.0000  
##  87398900 - fosforo_total 87398900 - nitrogenio_kjeldahl
##  Min.   :0.3526           Min.   :0.4385                
##  1st Qu.:0.5279           1st Qu.:0.9982                
##  Median :1.0000           Median :1.0000                
##  Mean   :0.8295           Mean   :0.9000                
##  3rd Qu.:1.0000           3rd Qu.:1.0000                
##  Max.   :1.0000           Max.   :1.0000                
##  87398900 - nitrogenio_total 87398900 - turbidez
##  Min.   :0.4067              Min.   :0.4067     
##  1st Qu.:0.9982              1st Qu.:0.9070     
##  Median :1.0000              Median :1.0000     
##  Mean   :0.8647              Mean   :0.8634     
##  3rd Qu.:1.0000              3rd Qu.:1.0000     
##  Max.   :1.0000              Max.   :1.0000     
##  87398900 - nitrogenio_amoniacal 87398900 - pH 87398900 - temperatura_agua
##  Min.   :0.3880                  Min.   :1     Min.   :-0.3893            
##  1st Qu.:0.7489                  1st Qu.:1     1st Qu.: 1.0000            
##  Median :1.0000                  Median :1     Median : 1.0000            
##  Mean   :0.8447                  Mean   :1     Mean   : 0.8931            
##  3rd Qu.:1.0000                  3rd Qu.:1     3rd Qu.: 1.0000            
##  Max.   :1.0000                  Max.   :1     Max.   : 1.0000            
##  87398900 - solidos_totais 87398900 - escherichia_coli 87398900 - ano_coleta
##  Min.   :0.4234            Min.   :1                   Min.   :0.3526       
##  1st Qu.:0.9070            1st Qu.:1                   1st Qu.:1.0000       
##  Median :1.0000            Median :1                   Median :1.0000       
##  Mean   :0.8748            Mean   :1                   Mean   :0.9502       
##  3rd Qu.:1.0000            3rd Qu.:1                   3rd Qu.:1.0000       
##  Max.   :1.0000            Max.   :1                   Max.   :1.0000       
##  87398900 - condutividade 87398950 - oxigenio_dissolvido 87398950 - dbo
##  Min.   :1                Min.   :-0.5945                Min.   :1     
##  1st Qu.:1                1st Qu.: 1.0000                1st Qu.:1     
##  Median :1                Median : 1.0000                Median :1     
##  Mean   :1                Mean   : 0.6475                Mean   :1     
##  3rd Qu.:1                3rd Qu.: 1.0000                3rd Qu.:1     
##  Max.   :1                Max.   : 1.0000                Max.   :1     
##  87398950 - fosforo_total 87398950 - nitrogenio_kjeldahl
##  Min.   :0.5497           Min.   :-0.5359               
##  1st Qu.:1.0000           1st Qu.: 1.0000               
##  Median :1.0000           Median : 1.0000               
##  Mean   :0.9307           Mean   : 0.8593               
##  3rd Qu.:1.0000           3rd Qu.: 1.0000               
##  Max.   :1.0000           Max.   : 1.0000               
##  87398950 - nitrogenio_total 87398950 - turbidez
##  Min.   :0.5497              Min.   :0.8455     
##  1st Qu.:1.0000              1st Qu.:1.0000     
##  Median :1.0000              Median :1.0000     
##  Mean   :0.9647              Mean   :0.9881     
##  3rd Qu.:1.0000              3rd Qu.:1.0000     
##  Max.   :1.0000              Max.   :1.0000     
##  87398950 - nitrogenio_amoniacal 87398950 - pH 87398950 - temperatura_agua
##  Min.   :1                       Min.   :1     Min.   :-0.5945            
##  1st Qu.:1                       1st Qu.:1     1st Qu.: 1.0000            
##  Median :1                       Median :1     Median : 1.0000            
##  Mean   :1                       Mean   :1     Mean   : 0.8773            
##  3rd Qu.:1                       3rd Qu.:1     3rd Qu.: 1.0000            
##  Max.   :1                       Max.   :1     Max.   : 1.0000            
##  87398950 - solidos_totais 87398950 - escherichia_coli 87398950 - ano_coleta
##  Min.   :0.8455            Min.   :1                   Min.   :1            
##  1st Qu.:1.0000            1st Qu.:1                   1st Qu.:1            
##  Median :1.0000            Median :1                   Median :1            
##  Mean   :0.9881            Mean   :1                   Mean   :1            
##  3rd Qu.:1.0000            3rd Qu.:1                   3rd Qu.:1            
##  Max.   :1.0000            Max.   :1                   Max.   :1            
##  87398950 - condutividade 87398980 - oxigenio_dissolvido 87398980 - dbo
##  Min.   :-0.4515          Min.   :1                      Min.   :1     
##  1st Qu.: 1.0000          1st Qu.:1                      1st Qu.:1     
##  Median : 1.0000          Median :1                      Median :1     
##  Mean   : 0.8318          Mean   :1                      Mean   :1     
##  3rd Qu.: 1.0000          3rd Qu.:1                      3rd Qu.:1     
##  Max.   : 1.0000          Max.   :1                      Max.   :1     
##  87398980 - fosforo_total 87398980 - nitrogenio_kjeldahl
##  Min.   :1                Min.   :1                     
##  1st Qu.:1                1st Qu.:1                     
##  Median :1                Median :1                     
##  Mean   :1                Mean   :1                     
##  3rd Qu.:1                3rd Qu.:1                     
##  Max.   :1                Max.   :1                     
##  87398980 - nitrogenio_total 87398980 - turbidez
##  Min.   :1                   Min.   :0.5681     
##  1st Qu.:1                   1st Qu.:1.0000     
##  Median :1                   Median :1.0000     
##  Mean   :1                   Mean   :0.9402     
##  3rd Qu.:1                   3rd Qu.:1.0000     
##  Max.   :1                   Max.   :1.0000     
##  87398980 - nitrogenio_amoniacal 87398980 - pH 87398980 - temperatura_agua
##  Min.   :1                       Min.   :1     Min.   :0.5681             
##  1st Qu.:1                       1st Qu.:1     1st Qu.:1.0000             
##  Median :1                       Median :1     Median :1.0000             
##  Mean   :1                       Mean   :1     Mean   :0.9668             
##  3rd Qu.:1                       3rd Qu.:1     3rd Qu.:1.0000             
##  Max.   :1                       Max.   :1     Max.   :1.0000             
##  87398980 - solidos_totais 87398980 - escherichia_coli 87398980 - ano_coleta
##  Min.   :0.6547            Min.   :1                   Min.   :1            
##  1st Qu.:1.0000            1st Qu.:1                   1st Qu.:1            
##  Median :1.0000            Median :1                   Median :1            
##  Mean   :0.9734            Mean   :1                   Mean   :1            
##  3rd Qu.:1.0000            3rd Qu.:1                   3rd Qu.:1            
##  Max.   :1.0000            Max.   :1                   Max.   :1            
##  87398980 - condutividade 87405500 - oxigenio_dissolvido 87405500 - dbo  
##  Min.   :1                Min.   :-0.3314                Min.   :0.4199  
##  1st Qu.:1                1st Qu.: 1.0000                1st Qu.:0.5402  
##  Median :1                Median : 1.0000                Median :1.0000  
##  Mean   :1                Mean   : 0.8976                Mean   :0.7900  
##  3rd Qu.:1                3rd Qu.: 1.0000                3rd Qu.:1.0000  
##  Max.   :1                Max.   : 1.0000                Max.   :1.0000  
##  87405500 - fosforo_total 87405500 - nitrogenio_kjeldahl
##  Min.   :-0.3314          Min.   :0.3930                
##  1st Qu.: 0.4828          1st Qu.:0.6656                
##  Median : 0.7834          Median :0.9319                
##  Mean   : 0.6601          Mean   :0.8206                
##  3rd Qu.: 1.0000          3rd Qu.:1.0000                
##  Max.   : 1.0000          Max.   :1.0000                
##  87405500 - nitrogenio_total 87405500 - turbidez
##  Min.   :0.5052              Min.   :0.3797     
##  1st Qu.:0.6036              1st Qu.:1.0000     
##  Median :0.9033              Median :1.0000     
##  Mean   :0.8197              Mean   :0.9523     
##  3rd Qu.:1.0000              3rd Qu.:1.0000     
##  Max.   :1.0000              Max.   :1.0000     
##  87405500 - nitrogenio_amoniacal 87405500 - pH    87405500 - temperatura_agua
##  Min.   :0.4993                  Min.   :0.3109   Min.   :0.3109             
##  1st Qu.:0.7350                  1st Qu.:0.4284   1st Qu.:0.4534             
##  Median :0.9033                  Median :0.5052   Median :0.5711             
##  Mean   :0.8353                  Mean   :0.6886   Mean   :0.7138             
##  3rd Qu.:1.0000                  3rd Qu.:1.0000   3rd Qu.:1.0000             
##  Max.   :1.0000                  Max.   :1.0000   Max.   :1.0000             
##  87405500 - solidos_totais 87405500 - escherichia_coli 87405500 - ano_coleta
##  Min.   :0.3797            Min.   :1                   Min.   :1            
##  1st Qu.:0.4477            1st Qu.:1                   1st Qu.:1            
##  Median :0.6036            Median :1                   Median :1            
##  Mean   :0.6652            Mean   :1                   Mean   :1            
##  3rd Qu.:1.0000            3rd Qu.:1                   3rd Qu.:1            
##  Max.   :1.0000            Max.   :1                   Max.   :1            
##  87405500 - condutividade 87406900 - oxigenio_dissolvido 87406900 - dbo  
##  Min.   :0.4527           Min.   :-0.5366                Min.   :0.5144  
##  1st Qu.:0.5737           1st Qu.: 1.0000                1st Qu.:0.7408  
##  Median :0.8099           Median : 1.0000                Median :1.0000  
##  Mean   :0.7836           Mean   : 0.6685                Mean   :0.8530  
##  3rd Qu.:1.0000           3rd Qu.: 1.0000                3rd Qu.:1.0000  
##  Max.   :1.0000           Max.   : 1.0000                Max.   :1.0000  
##  87406900 - fosforo_total 87406900 - nitrogenio_kjeldahl
##  Min.   :-0.3894          Min.   :-0.5366               
##  1st Qu.: 0.6154          1st Qu.: 0.6958               
##  Median : 0.7260          Median : 0.9305               
##  Mean   : 0.6906          Mean   : 0.7673               
##  3rd Qu.: 1.0000          3rd Qu.: 1.0000               
##  Max.   : 1.0000          Max.   : 1.0000               
##  87406900 - nitrogenio_total 87406900 - turbidez
##  Min.   :0.3926              Min.   :-0.4238    
##  1st Qu.:0.6754              1st Qu.: 1.0000    
##  Median :0.8658              Median : 1.0000    
##  Mean   :0.8084              Mean   : 0.8905    
##  3rd Qu.:1.0000              3rd Qu.: 1.0000    
##  Max.   :1.0000              Max.   : 1.0000    
##  87406900 - nitrogenio_amoniacal 87406900 - pH    87406900 - temperatura_agua
##  Min.   :0.4212                  Min.   :0.3926   Min.   :-0.3840            
##  1st Qu.:0.7397                  1st Qu.:1.0000   1st Qu.: 0.4569            
##  Median :0.8658                  Median :1.0000   Median : 0.6015            
##  Mean   :0.8237                  Mean   :0.8628   Mean   : 0.6624            
##  3rd Qu.:1.0000                  3rd Qu.:1.0000   3rd Qu.: 1.0000            
##  Max.   :1.0000                  Max.   :1.0000   Max.   : 1.0000            
##  87406900 - solidos_totais 87406900 - escherichia_coli 87406900 - ano_coleta
##  Min.   :0.4459            Min.   :1                   Min.   :-0.4238      
##  1st Qu.:0.6187            1st Qu.:1                   1st Qu.: 1.0000      
##  Median :0.6958            Median :1                   Median : 1.0000      
##  Mean   :0.7839            Mean   :1                   Mean   : 0.8905      
##  3rd Qu.:1.0000            3rd Qu.:1                   3rd Qu.: 1.0000      
##  Max.   :1.0000            Max.   :1                   Max.   : 1.0000      
##  87406900 - condutividade 87409900 - oxigenio_dissolvido 87409900 - dbo  
##  Min.   :0.4024           Min.   :1                      Min.   :0.5624  
##  1st Qu.:0.6399           1st Qu.:1                      1st Qu.:1.0000  
##  Median :0.8068           Median :1                      Median :1.0000  
##  Mean   :0.7870           Mean   :1                      Mean   :0.9371  
##  3rd Qu.:1.0000           3rd Qu.:1                      3rd Qu.:1.0000  
##  Max.   :1.0000           Max.   :1                      Max.   :1.0000  
##  87409900 - fosforo_total 87409900 - nitrogenio_kjeldahl
##  Min.   :0.4560           Min.   :0.6898                
##  1st Qu.:0.8175           1st Qu.:0.9999                
##  Median :0.8565           Median :1.0000                
##  Mean   :0.8426           Mean   :0.9603                
##  3rd Qu.:1.0000           3rd Qu.:1.0000                
##  Max.   :1.0000           Max.   :1.0000                
##  87409900 - nitrogenio_total 87409900 - turbidez
##  Min.   :0.5245              Min.   :0.4405     
##  1st Qu.:0.8314              1st Qu.:1.0000     
##  Median :1.0000              Median :1.0000     
##  Mean   :0.8823              Mean   :0.9570     
##  3rd Qu.:1.0000              3rd Qu.:1.0000     
##  Max.   :1.0000              Max.   :1.0000     
##  87409900 - nitrogenio_amoniacal 87409900 - pH    87409900 - temperatura_agua
##  Min.   :0.7569                  Min.   :0.4049   Min.   :0.4309             
##  1st Qu.:0.8915                  1st Qu.:1.0000   1st Qu.:1.0000             
##  Median :1.0000                  Median :1.0000   Median :1.0000             
##  Mean   :0.9482                  Mean   :0.9542   Mean   :0.9562             
##  3rd Qu.:1.0000                  3rd Qu.:1.0000   3rd Qu.:1.0000             
##  Max.   :1.0000                  Max.   :1.0000   Max.   :1.0000             
##  87409900 - solidos_totais 87409900 - escherichia_coli 87409900 - ano_coleta
##  Min.   :0.4405            Min.   :0.4528              Min.   :0.4528       
##  1st Qu.:0.5429            1st Qu.:0.5245              1st Qu.:1.0000       
##  Median :1.0000            Median :1.0000              Median :1.0000       
##  Mean   :0.8442            Mean   :0.8215              Mean   :0.9579       
##  3rd Qu.:1.0000            3rd Qu.:1.0000              3rd Qu.:1.0000       
##  Max.   :1.0000            Max.   :1.0000              Max.   :1.0000       
##  87409900 - condutividade
##  Min.   :0.4049          
##  1st Qu.:0.4895          
##  Median :0.7254          
##  Mean   :0.7294          
##  3rd Qu.:1.0000          
##  Max.   :1.0000
parametros_IQA %>% 
  # group_by(codigo) %>% 
  dplyr::select(
    nitrogenio_kjeldahl, condutividade
  ) %>% 
  # correlation::cor_test() %>% 
  plot()

correlação-parametros-qualidade-agua-gravataí no período 1990-2020Time for this code chunk to run: 2.73962092399597

9.1.2 Condutividade elétrica

(cond_elet <- ggplot(plan_wide_19902020,
                        aes(codigo,
                            condutividade))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_summary(
     fun.data = f,
     geom = 'errorbar',
     width = 0.3,
     position = position_dodge(width = 0.65),
   )+
   stat_summary(
     fun.data = f,
     geom = "boxplot",
     width = 0.7,
     fill = '#F8F8FF',
     color = "black",
     outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
   )+
   facet_wrap(~periodo)+
      labs(title = "Condutividade elétrica no período 1990-2020",
        x="Estação",
        y="µmhos/cm")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$condutividade, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

condutividade-eletrica-gravataí no período 1990-2020Time for this code chunk to run: 1.33914089202881

(cond_elet_p1 <- ggplot(plan_wide_19902020 %>% 
                          filter(ano_coleta>"2000" &
                                   ano_coleta<="2010"),
                        aes(codigo,
                            condutividade))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
      labs(title = "Condutividade elétrica no período 1990-2000",
        x="Estação",
        y="µmhos/cm")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$condutividade, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.630928039550781

(cond_elet_p2 <- ggplot(plan_wide_19902020 %>% 
                          filter(ano_coleta>"2000" &
                                   ano_coleta<="2010"),
                        aes(codigo,
                            condutividade))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Condutividade elétrica no período 2000-2010",
        x="Estação",
        y="µmhos/cm")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$condutividade, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.727335929870605

(cond_elet_p3 <- ggplot(plan_wide_19902020 %>% 
                          filter(ano_coleta>"2010" &
                                   ano_coleta<="2020"),
                        aes(codigo,
                            condutividade))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Condutividade elétrica no período 2010-2020",
        x="Estação",
        y="µmhos/cm")+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$condutividade, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
    ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_x_discrete(limits = c("87398500", 
                               "87398980", 
                               "87398900", 
                               "87398950", 
                               "87405500", 
                               "87406900", 
                               "87409900"),
                    labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
   )+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.597105026245117

grid.arrange(cond_elet_p1, cond_elet_p2, cond_elet_p3, ncol = 3)

Time for this code chunk to run: 1.82918095588684

(sum_cond_elet_p1 <- plan_wide_19902020 %>%
   select(codigo, condutividade, ano_coleta) %>% 
   filter(ano_coleta>"1990" &
            ano_coleta<="2000") %>% 
   group_by(codigo) %>% 
   summarize(
     min = 
       min(condutividade, 
           na.rm = TRUE),
     q1 = 
       quantile(condutividade, 0.25, 
                na.rm = TRUE),
     median = 
       median(condutividade, 
              na.rm = TRUE),
     mean = 
       mean(condutividade, 
            na.rm= TRUE),
     q3 = 
       quantile(condutividade, 0.75, 
                na.rm = TRUE),
     max = 
       max(condutividade, 
           na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   9.4  51.1   67    75.1  83.2 340  
## 2 87398900  10    41.5   51    55.3  64.2 160  
## 3 87398950   9    41.5   51.5  60.1  69.5 160  
## 4 87398980  11.3  42.4   52.0  53.0  67.0  83.8
## 5 87405500  25    68.7   88.2 130.  170   560  
## 6 87406900  52    88.4  133.  193.  256.  576  
## 7 87409900  29    80    110.  134.  168.  460
(sum_cond_elet_p2 <- plan_wide_19902020 %>%
    select(codigo, condutividade, ano_coleta) %>% 
    filter(ano_coleta>"2000" &
             ano_coleta<="2010") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(condutividade, 
            na.rm = TRUE),
      q1 = 
        quantile(condutividade, 0.25, 
                 na.rm = TRUE),
      median = 
        median(condutividade, 
               na.rm = TRUE),
      mean = 
        mean(condutividade, 
             na.rm= TRUE),
      q3 = 
        quantile(condutividade, 0.75, 
                 na.rm = TRUE),
      max = 
        max(condutividade, 
            na.rm = TRUE))
)
## # A tibble: 7 × 7
##   codigo     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  11.9  67.0   82.6  84.8 102.   164.
## 2 87398900  11    44.4   52.3  57.1  72.6  136.
## 3 87398950  39.8  58.4   76    82.3  98.3  160 
## 4 87398980   9.4  42.4   49.7  51.5  62    114.
## 5 87405500  17    77.5  107   142.  171.   679 
## 6 87406900  23.1  85.6  124.  164.  199.   619 
## 7 87409900  56.1 114.   177   200.  242    454
(sum_cond_elet_p3 <- plan_wide_19902020 %>%
    select(codigo, condutividade, ano_coleta) %>% 
    filter(ano_coleta>"2010" &
             ano_coleta<="2020") %>% 
    group_by(codigo) %>% 
    summarize(
      min = 
        min(condutividade, 
            na.rm = TRUE),
      q1 = 
        quantile(condutividade, 0.25, 
                 na.rm = TRUE),
      median = 
        median(condutividade, 
               na.rm = TRUE),
      mean = 
        mean(condutividade, 
             na.rm= TRUE),
      q3 = 
        quantile(condutividade, 0.75, 
                 na.rm = TRUE),
      max = 
        max(condutividade, 
            na.rm = TRUE),
      n = 
        length(condutividade))
)
## # A tibble: 7 × 8
##   codigo     min    q1 median  mean    q3   max     n
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <int>
## 1 87398500  0.01  68.5   80.2  80.4  99.5 125.     34
## 2 87398900 39.7   53.4   58.3  61.1  65.5 103      36
## 3 87398950 40.9   64.7   70.1  76.1  82.5 195.     35
## 4 87398980 43.2   51.7   54.0  56.3  61.0  78.9    28
## 5 87405500 47     85.8  121.  146.  209.  286      33
## 6 87406900 62.7   95.9  142.  163.  216.  354.     35
## 7 87409900 65.7  121.   159.  179.  245.  498.     37
# plan_wide_19902020 %>% 
#    select(codigo, IQA) %>% 
#    group_by(codigo) %>% 
#    summarize(
#       min = 
#          min(IQA, 
#              na.rm = TRUE),
#       q1 = 
#          quantile(IQA, 0.25, 
#                   na.rm = TRUE),
#       median = 
#          median(IQA, 
#                 na.rm = TRUE),
#       mean = 
#          mean(IQA, 
#               na.rm= TRUE),
#       q3 = 
#          quantile(IQA, 0.75, 
#                   na.rm = TRUE),
#       max = 
#          max(IQA, 
#              na.rm = TRUE))

Time for this code chunk to run: 0.204574108123779

ggsave("cond_elet.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = cond_elet,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("cond_elet_p1.png",
       plot = cond_elet_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("cond_elet_p2.png",
       plot = cond_elet_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("cond_elet_p3.png",
       plot = cond_elet_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")

ggsave("cond_elet_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(cond_elet_p1, cond_elet_p2, cond_elet_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")

Time for this code chunk to run: 6.51275515556335

9.2 Textando o texto

  • § falar do comportamento geral dos dados
  • 2º § - xº § -> abordar os principais parâmetros que estão sendo impactados, detalhando, nas estações mais relevantes, como ficaram os quartis/mediana etc.

10.8

Os resultados apontam que para o parâmetro OD

9.3 Gráficos exemplos boxplot

set.seed(2023)
exemplo_boxplot_df <- data.frame(
  PM = c("PM1"),
  # letras = letters[seq( from = 1, to = 1 )],
  Stat1 = rnorm(100, 
                mean = 5, 
                sd = 1.8)
)

(sumario_exemplo_bp <- exemplo_boxplot_df %>% 
    group_by(PM) %>% 
    summarize(
      max = max(Stat1),
      p95 = quantile(Stat1, 0.95),
      p80 = quantile(Stat1, 0.8),
      median = median(Stat1),
      p20 = quantile(Stat1, 0.2),
      p05 = quantile(Stat1, 0.05),
      min = min(Stat1),
    ) %>% 
    t() %>% 
    row_to_names(row_number = 1) %>% 
    as.numeric()
)
## [1] 9.923430 7.866927 6.683828 4.886935 3.545771 2.277104 1.282177
(boxplot_example <- exemplo_boxplot_df %>% 
    ggplot(
      aes(
        x = PM,
        y = Stat1,
      )
    )+
    stat_summary(
      fun.data = f,
      geom = 'errorbar',
      width = 0.15,
      position = position_dodge(width = 0.65),
    )+
    stat_summary(
      fun.data = f,
      geom = "boxplot",
      width = 0.40,
      fill = '#F8F8FF',
      color = "black",
      outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
    )+
    labs(
      title = "Elementos do *boxplot*",
      x= NULL,
      y= NULL
    )+
    ggbeeswarm::geom_quasirandom(
      size = 1.4,
      alpha = .3,
      width = .07,
    )+
    scale_y_continuous(
      expand = expansion(mult = c(0,0)),
      n.breaks = 8,
      limits = c(-0.3,12)
    )+
    annotate(
      geom = "text",
      x = 1.55,
      hjust = "right",
      y = sumario_exemplo_bp,
      label = c("Valor máximo", "P95", "P80", "Mediana", "P20", "P05", "Valor mínimo"),
      # fontface = 3
    )+
    geom_richtext(
      x = 0.56,
      y = 9.103998,
      label.color = NA,
      hjust = "center",
      label = "<i>Outliers</i>"
    )+
    geom_curve(
      aes(
        x = 0.6, xend = 0.98,
        y = 9.103998 , yend = 9.103998 , #Outliers
      ),
      curvature = 0,
      size = 1.0,
      arrow = arrow(length = unit(0.05, "npc")),
      lineend = "round"
    )+
    #definindo o [
    geom_curve(
      aes(
        x = 0.74, xend = 0.78,
        y = 6.683828, yend = 6.683828,
      ),
      curvature = 0,
      size = 1.0,
      lineend = "butt"
    )+
    geom_curve(
      aes(
        x = 0.74, xend = 0.74,
        y = 3.545771, yend = 6.683828,
      ),
      curvature = 0,
      size = 1.0,
      lineend = "butt"
    )+
    annotate(
      geom = "text",
      x = 0.56,
      hjust = "center",
      y = 5.11,
      label = "Amplitude\n(P80-P20)"
    )+
    geom_curve(
      aes(
        x = 0.74, xend = 0.78,
        y = 3.545771 , yend = 3.545771 ,
      ),
      curvature = 0,
      size = 1.0,
      lineend = "butt"
    )+
    # fim do [
    geom_curve(
      aes(
        x = 0.6, xend = 0.90,
        y = 7.866927 , yend = 7.866927 , #whisker superior
      ),
      curvature = 0,
      size = 1.0,
      arrow = arrow(length = unit(0.05, "npc")),
      lineend = "round"
    )+
    annotate(
      geom = "text",
      x = 0.56,
      hjust = "center",
      y = 7.866927,
      label = "Whisker\nsuperior"
    )+
    geom_curve(
      aes(
        x = 0.6, xend = 0.90,
        y = 2.277104  , yend = 2.277104  , #whisker inferior
      ),
      curvature = 0,
      size = 1.0,
      arrow = arrow(length = unit(0.05, "npc")),
      lineend = "round"
    )+
    annotate(
      geom = "text",
      x = 0.56,
      hjust = "center",
      y = 2.277104,
      label = "Whisker\ninferior"
    )+
    geom_curve(
      aes(
        x = 1.4, xend = 1.01,
        y = 9.92343, yend = 9.92343, #valor máximo
      ),
      curvature = 0,
      size = 1.0,
      arrow = arrow(length = unit(0.05, "npc")),
      lineend = "round"
    )+
    geom_curve(
      aes(
        x = 1.45, xend = 1.11,
        y = 7.866927 , yend = 7.866927 , #P95
      ),
      curvature = 0,
      size = 1.0,
      arrow = arrow(length = unit(0.05, "npc")),
      lineend = "round"
    )+
    geom_curve(
      aes(
        x = 1.45, xend = 1.22,
        y = 6.683828  , yend = 6.683828  , #P80
      ),
      curvature = 0,
      size = 1.0,
      arrow = arrow(length = unit(0.05, "npc")),
      lineend = "round"
    )+
    geom_curve(
      aes(
        x = 1.45, xend = 1.22,
        y = 4.886935   , yend = 4.886935   , #P50
      ),
      curvature = 0,
      size = 1.0,
      arrow = arrow(length = unit(0.05, "npc")),
      lineend = "round"
    )+
    geom_curve(
      aes(
        x = 1.45, xend = 1.22,
        y = 3.545771, yend = 3.545771, #P20
      ),
      curvature = 0,
      size = 1.0,
      arrow = arrow(length = unit(0.05, "npc")),
      lineend = "round"
    )+
    geom_curve(
      aes(
        x = 1.45, xend = 1.11,
        y = 2.277104, yend = 2.277104, #P05
      ),
      curvature = 0,
      size = 1.0,
      arrow = arrow(length = unit(0.05, "npc")),
      lineend = "round"
    )+
    geom_curve(
      aes(
        x = 1.4, xend = 1.01,
        y = 1.282177, yend = 1.282177, #valor mínimo
      ),
      curvature = 0,
      size = 1.0,
      arrow = arrow(length = unit(0.05, "npc")),
      lineend = "round"
    )+
    # theme_grafs()+
    theme_bw()+
    theme(
      plot.title = 
        element_markdown(
          hjust = 0.5,
          color = "black",
          size = 19),
    )
)

Time for this code chunk to run: 2.35132479667664

ggsave(
  filename = "exemplo_boxplot.png",
  plot = boxplot_example,
  units = c("px"),
  width = (4500)/1.5,
  height = (2993)/1.5,
  path = "./graficos",
  dpi = 300,
  # type = "cairo"
)

Time for this code chunk to run: 2.47104907035828

set.seed(2021)

data <- tibble(
  grupo = factor(
    c(rep(
      "Grupo 1", 100), 
      rep("Grupo 2", 250), 
      rep("Grupo 3", 25)
    )
  ),
  valor = c(seq(0, 20, length.out = 100),
            c(rep(0, 5), 
              rnorm(30, 2, .1), 
              rnorm(90, 5.4, .1), 
              rnorm(90, 14.6, .1), 
              rnorm(30, 18, .1), 
              rep(20, 5)
            ),
            rep(seq(0, 20, length.out = 5), 5))
) %>% 
  rowwise() %>%
  mutate(
    valor = if_else(
      grupo == "Grupo 2", valor + rnorm(1, 0, .4), 
      valor
      )
    )

## function to return median and labels
n_fun <- function(x){
  return(
    data.frame(
      y = median(x) - 1.25, 
      label = paste0(
        "n = ",length(x)
      )
    )
  )
}

Time for this code chunk to run: 0.152824878692627

(tukey_n_boxplot <- ggplot(data, 
                           aes(x = grupo, 
                               y = valor)
)+
  stat_boxplot(geom = 'errorbar',
               width = 0.15,
               position = position_dodge(width = 0.65))+
  geom_boxplot(fill = "grey92",
               width = 0.40,
               position = position_dodge(width = 0.65))+
  ## use summary function to add text labels
  stat_summary(
    geom = "text",
    fun.data = n_fun,
    # family = "Oswald",
    size = 5
  )+
  labs(
    title = "Tukey *boxplot*",
    x= NULL,
    # y="mg/L"
  )+
  # theme_grafs()+
  theme_bw()+
  theme(
    axis.text.y = element_text(
      angle = 90, 
      # size=15,
      # face=2
    ),
    plot.title = 
      element_markdown(
        hjust = 0.5,
        color = "black",
        size = 19)
  )
)

(tukey_boxplot <- ggplot(data, aes(x = grupo, 
                                   y = valor)) +
  stat_boxplot(geom = 'errorbar',
               width = 0.15,
               position = position_dodge(width = 0.65))+
  geom_boxplot(fill = "grey92",
               width = 0.40,
               position = position_dodge(width = 0.65)) +
  ## use either geom_point() or geom_jitter()
  geom_point(
    ## draw bigger points
    size = 2,
    ## add some transparency
    alpha = .25,
    ## add some jittering
    position = position_jitter(
      ## control randomness and range of jitter
      seed = 1, width = .2
    )
  )+
  theme_bw()+
  labs(
      title = "Tukey *boxplot*",
      x= NULL,
      # y="mg/L"
    )+
  # theme_grafs()+
  theme_bw()+
  theme(
        axis.text.y = element_text(
          angle = 90, 
          # size=15,
          # face=2
        ),
        plot.title = 
          element_markdown(
            hjust = 0.5,
            color = "black",
            size = 19)
    ))

Time for this code chunk to run: 1.10362911224365

data %>% 
  group_by(grupo) %>% 
  summarize(
    min = min(valor),
    P20 = quantile(valor, 0.20),
    q1 = quantile(valor, 0.25),
    mediana = median(valor),
    q3 = quantile(valor, 0.75),
    P80 = quantile(valor, 0.80),
    max = max(valor)
  ) %>% 
  t() %>% 
  row_to_names(row_number = 1)
##         Grupo 1      Grupo 2      Grupo 3     
## min     " 0.0000000" "-0.6345142" " 0.0000000"
## P20     "4.000000"   "5.057189"   "4.000000"  
## q1      "5.000000"   "5.245691"   "5.000000"  
## mediana "10.00000"   "10.01593"   "10.00000"  
## q3      "15.00000"   "14.81205"   "15.00000"  
## P80     "16.00000"   "15.04351"   "16.00000"  
## max     "20.0000"    "20.3882"    "20.0000"
(box_percentile_plot <- ggplot(data, 
       aes(x = grupo, y = valor)
       ) +
      stat_summary(
        fun.data = f,
        geom = 'errorbar',
        width = 0.15,
        position = position_dodge(width = 0.65),
      )+
      stat_summary(
        fun.data = f,
        geom = "boxplot",
        width = 0.40,
        fill = 'grey92',
        color = "black",
        outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
      )+
  # geom_boxplot(fill = "grey92") +
  ## use either geom_point() or geom_jitter()
  geom_point(
    ## draw bigger points
    size = 2,
    ## add some transparency
    alpha = .25,
    ## add some jittering
    position = position_jitter(
      ## control randomness and range of jitter
      seed = 1, width = .2
    )
  )+
  labs(
      title = "*Box Percentile-Plot*",
      x= NULL,
      # y="mg/L"
    )+
  # theme_grafs()+
  theme_bw()+
  theme(
        axis.text.y = element_text(
          angle = 90, 
          # size = 15,
          # face = 2
        ),
        plot.title = 
          element_markdown(
            hjust = 0.5,
            color = "black",
            size = 19)
    )
  )

grid.arrange(
  tukey_boxplot, box_percentile_plot, 
  ncol = 2
  )

fig_tukey_garrett <- plot_grid(tukey_boxplot, box_percentile_plot, 
                               labels = "AUTO")

Time for this code chunk to run: 2.12748694419861

ggsave(
  filename = "tukey_n_boxplot.png",
  plot = tukey_n_boxplot,
  units = c("px"),
  width = 4500,
  height = 2993,
  path = "./graficos",
  dpi = 300,
  # type = "cairo"
)

ggsave(
  filename = "tukey_boxplot.png",
  plot = tukey_boxplot,
  units = c("px"),
  width = 4500,
  height = 2993,
  path = "./graficos",
  dpi = 300,
  # type = "cairo"
)

ggsave(
  filename = "box_percentile_plot.png",
  plot = box_percentile_plot,
  units = c("px"),
  width = 4500,
  height = 2993,
  path = "./graficos",
  dpi = 300,
  # type = "cairo"
)

ggsave(
  filename = "fig_tukey_garrett.png",
  plot = fig_tukey_garrett,
  units = c("px"),
  width = 4500,
  height = 2993,
  path = "./graficos",
  dpi = 300,
  # type = "cairo"
)

Time for this code chunk to run: 3.09082198143005

LS0tDQp0aXRsZTogIlRDQyINCmF1dGhvcjogIkxlb25hcmRvIEZlcm5hbmRlcyBXaW5rIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQvJW0vJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGRpc3RpbGw6OmRpc3RpbGxfYXJ0aWNsZToNCiAgICBoaWdobGlnaHQ6IGhhZGRvY2sNCiAgICBrZWVwX21kOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogbm8NCiAgICAgIHNtb290aF9zY3JvbGw6IG5vDQogICAgZmlnX3dpZHRoOiAxMA0KICAgIGZpZ19oZWlnaHQ6IDYuNjYNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgZ2l0aHViX2RvY3VtZW50Og0KICAgIGh0bWxfcHJldmlldzogdHJ1ZQ0KYWx3YXlzX2FsbG93X2h0bWw6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KZmlnLmFsaWduOiBjZW50ZXINCi0tLQ0KDQpgYGB7ciBSb3RpbmEgcHJhIHRvZGEgdmV6IHF1ZSBhYnJpciBvIGRvY3VtZW50bywgZWNobyA9IEZBTFNFfQ0KIyBBYnJpciBvIEdpdEh1YiBEZXNrdG9wDQojIFZlcmlmaWNhciBzZSBow6EgcHVsbCBwcmEgc2VyIGZlaXRvDQojIEFicmlyIG8gUlN0dWRpbw0KYGBgDQoNCiMgQnJpZWYgZXhwbGFuYXRpb24NCg0KRXZlcnkgYm94cGxvdCBtZWFucyBhIG1vbml0b3JpbmcgcG9pbnQgKFBvbnRvIGRlIG1vbml0b3JhbWVudG8gKG9yIFBNKSBpbiBwb3J0dWd1ZXNlKS4gTXkgZ29hbCBoZXJlIGlzIHRvIGFuYWx5emUgdGhlIGV2b2x1dGlvbiBiZXR3ZWVuIGRlY2FkZXMgb2YgZWFjaCB3YXRlciBxdWFsaXR5IHBhcmFtZXRlciB0aGF0IGNvbXBvdW5kcyB0aGUgV2F0ZXIgUXVhbGl0eSBJbmRleCAoV1FJKS4NCg0KVGhlIHJpdmVyIGZsb3dzIGluIHRoZSBlYXN0LXdlc3QgZGlyZWN0aW9uIGFzIHNob3duIGluIHRoZSBpbWFnZSBiZWxvdy4NCg0KIVtdKGltYWdlcy9wYXN0ZS03QUQ3MDI3Ri5wbmcpDQoNClRoZSBsb2dpYyBiZWhpbmQgdGhlIHNvcnRpbmcgaW4gdGhlIGJveHBsb3RzIGlzIGJlY2F1c2Ugb2YgMiBtYWluIHJlYXNvbnM6DQoNCjEuICBUaGUgb3JpZ2luYWwgbW9uaXRvcmluZyBwb2ludCBpc24ndCBlYXN5IHRvIHVuZGVyc3RhbmQgKDggZGlnaXRzLCBsaWtlIDg3NDA5OTAwKQ0KMi4gIENoYW5naW5nIHRoZSBvcmlnaW5hbCBub21lbmNsYXR1cmUgdG8gUE0xLCBQTTIgKC4uLikgbWFrZXMgaXQgZWFzaWVyIHRvIHVuZGVyc3RhbmQgdGhhdCB0aGUgbGFzdCBwb2ludCBoYXMgd2F0ZXIgY29udHJpYnV0aW9ucyBvZiBldmVyeSBvdGhlciBwb2ludCB1cHN0cmVhbS4NCg0KU29tZSBmZWF0dXJlcyB0aGF0IEkgd2FudCB0byBhZGQ6DQoNCi0gICBJZiB0aGUgcGFyYW1ldGVyIGlzIHgsIHRoZW4gdXNlIHgncyBjbGFzc2VzICh3aXRoIGl0cyBvd24gY2xhc3NlcyBiYWNrZ3JvdW5kIGNvbG9yIHBsb3R0ZWQpDQoNCi0gICBEZWZpbmUgdGhlIHRpbWVzY2FsZSwgc2hvdWxkIGFjdCBqdXN0IGxpa2UgYSBmaWx0ZXINCg0KYGBge3IgcDEgZXhhbXBsZSwgZXZhbD1GQUxTRX0NCiMgcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KIyAgIGZpbHRlcihhbm9fY29sZXRhID4gIjE5OTAiICYNCiMgICAgICAgICAgYW5vX2NvbGV0YSA8PSAiMjAwMCIpDQpgYGANCg0KIyBBbm90YcOnw7VlcyBkZSBjb2lzYXMgcG9yIGZhemVyOg0KDQotICAgRGVzY29icmlyIGNvbW8gY29sb2NhciBhcyBlc3Rhw6fDtWVzIG5vIHNlbnRpZG8gY29ycmV0byBtb250YW50ZSAtXD4ganVzYW50ZSBub3Mgc3Vtw6FyaW9zDQoNCj4gODczOTg1MDAsIDg3Mzk4OTgwLCA4NzM5ODkwMCwgODczOTg5NTAsIDg3NDA1NTAwLCA4NzQwNjkwMCwgODc0MDk5MDANCg0KLSAgIH5+QXByZW5kZXIgYSBzZWdtZW50YXIgbyBtZXUgZGF0YXNldCBwb3IgcGVyw61vZG9zfn4NCi0gICBhcHJlbmRlciBhIGNyaWFyIHVtYSBub3ZhIGNvbHVuYSBjb20gYSBzZWdtZW50YcOnw6NvIGRvcyBwZXLDrW9kb3MNCi0gICBtYXliZSB1c2UgYH5mYWNldC5ncmlkYA0KLSAgIGFwcmVuZGVyIGEgY29sb2NhciBhIGxlZ2VuZGEgZGVudHJvIGRvIGdyw6FmaWNvDQogICAgLSAgIHJlZHV6aXIgbyB0YW1hbmhvIGRhIGxlZ2VuZGENCi0gICB+fmNvcnJpZ2lyIG9zIHZhbG9yZXMgMCBkZSBJUUEgcHJhIE5Bfn4NCi0gICBkZXNjb2JyaXIgY29tbyBjb25zZWd1aXIgYSBlcXVhw6fDo28gZG8gbG0NCi0gICB+fmFwcmVuZGVyIGEgcGl2b3RhciBvIHN1bcOhcmlvfn4gLVw+IG1ldSBzdW3DoXJpbyBkbyBnb29nbGUgZG9jcyB0YSBiYXRlbmRvIGRpcmVpdGluaG8gY29tIG8gZG8gUg0KLSAgIGRlc2NvYnJpciBzZSBow6Egb3V0cm9zIFRDQ3MgY29tIGRpc3BvbmliaWxpemHDp8OjbyBkZSBjw7NkaWdvcw0KLSAgIH5+YE5hbW9uYCB0w6EgY29tIGNvbSBjYXNhIGRlY2ltYWwgYCIsImAgZSBgcHRvdGAgdMOhIGNvbSBgIi4iYH5+DQotICAgY29ycmVsYcOnw6NvIGZvcnRlIGVudHJlIGNvbmR1dGl2aWRhZGUgZSBOYW1vbi9QdG90L0RCTw0KDQp8IDE5OTAtMjAwMCB8IDIwMDAtMjAxMCB8IDIwMTAtMjAyMCB8DQp8Oi0tLS0tLS0tLTp8Oi0tLS0tLS0tLTp8Oi0tLS0tLS0tLTp8DQp8IDE5OTAtMjAwMCB8IDIwMDAtMjAxMCB8IDIwMTAtMjAyMCB8DQoNCiMgSW5zdGFsYXIgb3MgcGFjb3Rlcw0KDQpgYGB7ciBpbnN0YWxhciBwYWNvdGVzLCBldmFsPUZBTFNFfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKHRpZHl2ZXJzZSkNCmBgYA0KDQojIyBhY2Vzc2FyIG9zIHBhY290ZXMNCg0KYGBge3IgQWNlc3NhciBvcyBwYWNvdGVzLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBUUlVFfQ0KIyBsaWJyYXJ5KGdncHVicikNCnBhY21hbjo6cF9sb2FkKHJlYWRyLCBybWFya2Rvd24sIHJlYWR4bCwgamFuaXRvciwNCiAgICAgICAgICAgICAgIHBpbGxhciwgZHBseXIsIHRpZHl2ZXJzZSwNCiAgICAgICAgICAgICAgICMgZ2FwbWluZGVyLCANCiAgICAgICAgICAgICAgIGtuaXRyLCBrYWJsZUV4dHJhLCBzZWUsDQogICAgICAgICAgICAgICBncmlkRXh0cmEsICNtb2RlbHN1bW1hcnksIA0KICAgICAgICAgICAgICAgZ3RzdW1tYXJ5LCBnZ3Bsb3QyLA0KICAgICAgICAgICAgICAgZ2diZWVzd2FybSwgR0dhbGx5LCBnZ3RleHQsIGNvd3Bsb3QsDQogICAgICAgICAgICAgICByZXBvcnQpDQojIHBhY21hbjo6cF9sb2FkKHRpYmJsZXRpbWUpDQojIGNpdGVfcGFja2FnZXMoKQ0KYGBgDQoNCmBgYHtyIGNyb25vbWV0cmFuZG8gcXVhbnRvIHRlbXBvIGNhZGEgY2h1bmsgbGV2YX0NCmtuaXRyOjprbml0X2hvb2tzJHNldCh0aW1lX2l0ID0gbG9jYWwoew0KICAgbm93IDwtIE5VTEwNCiAgIGZ1bmN0aW9uKGJlZm9yZSwgb3B0aW9ucykgew0KICAgICAgaWYgKGJlZm9yZSkgew0KICAgICAgICAgIyByZWNvcmQgdGhlIGN1cnJlbnQgdGltZSBiZWZvcmUgZWFjaCBjaHVuaw0KICAgICAgICAgbm93IDw8LSBTeXMudGltZSgpDQogICAgICB9IGVsc2Ugew0KICAgICAgICAgIyBjYWxjdWxhdGUgdGhlIHRpbWUgZGlmZmVyZW5jZSBhZnRlciBhIGNodW5rDQogICAgICAgICByZXMgPC0gZGlmZnRpbWUoU3lzLnRpbWUoKSwgbm93KQ0KICAgICAgICAgIyByZXR1cm4gYSBjaGFyYWN0ZXIgc3RyaW5nIHRvIHNob3cgdGhlIHRpbWUNCiAgICAgICAgIHBhc3RlKCJUaW1lIGZvciB0aGlzIGNvZGUgY2h1bmsgdG8gcnVuOiIsIHJlcykNCiAgICAgIH0NCiAgIH0NCn0pKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQodGltZV9pdCA9IFRSVUUpDQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIyMgcmVmZXJlbmNpYW5kbyBvcyBwYWNvdGVzDQoNCmBgYHtyIHJlZmVyZW5jaWFuZG8gb3MgcGFjb3Rlc30NCiMgdmVyc2lvbiR2ZXJzaW9uLnN0cmluZw0KIyBjaXRhdGlvbihwYWNrYWdlID0gInRpZHl2ZXJzZSIpDQpgYGANCg0KIyMgaW1wb3J0YW5kbyBhIHBsYW5pbGhhDQoNCmBgYHtyIEltcG9ydGFuZG8gYSBwbGFuaWxoYSwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gVFJVRSwgd2FybmluZyA9IEZBTFNFfQ0KcGxhbl93aWRlXzE5OTAyMDIwIDwtIHJlYWRfZGVsaW0oImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9sZW9uYXJkb2Z3aW5rL1RDQ19naC9tYWluL3BsYW5fd2lkZV8xOTkwMjAyMC50c3YiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW0gPSAiXHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGNvbHMoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsY2FsaW5pZGFkZSA9IGNvbF9kb3VibGUoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ESUdPID0gY29sX2NoYXJhY3RlcigpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09PUkRfR0VPX0xBVF9HUkFVID0gY29sX2RvdWJsZSgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT09SRF9HRU9fTE9OR19HUkFVID0gY29sX2RvdWJsZSgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX0NPTEVUQSA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlZC8lbS8lWSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaXRyYXRvID0gY29sX2RvdWJsZSgpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTml0cml0byA9IGNvbF9kb3VibGUoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUID0gY29sX2RvdWJsZSgpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUID0gY29sX2RvdWJsZSgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVmF6YW9gID0gY29sX2RvdWJsZSgpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFZhemFvIHJpb2AgPSBjb2xfZG91YmxlKCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfbmFtZXMgPSAicHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbF9tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZ19tYXJrID0gIiINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmltX3dzID0gVFJVRQ0KKSAlPiUgDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIA0KICByZW5hbWUoDQogICAgcEggPSBwX2gsDQogICAgaXFhX3BIID0gaXFhX3BfaCwNCiAgICBpcWFfcEhfMiA9IGlxYV9wX2hfMg0KICApICU+JSANCiAgbXV0YXRlKA0KICAgIHBvbnRvX21vbml0b3JhbWVudG8gPSBjYXNlX3doZW4oDQogICAgICBjb2RpZ28gPT0gIjg3Mzk4NTAwIiB+ICJQTTEiLA0KICAgICAgY29kaWdvID09ICI4NzM5ODk4MCIgfiAiUE0yIiwNCiAgICAgIGNvZGlnbyA9PSAiODczOTg5MDAiIH4gIlBNMyIsDQogICAgICBjb2RpZ28gPT0gIjg3Mzk4OTUwIiB+ICJQTTQiLA0KICAgICAgY29kaWdvID09ICI4NzQwNTUwMCIgfiAiUE01IiwNCiAgICAgIGNvZGlnbyA9PSAiODc0MDY5MDAiIH4gIlBNNiIsDQogICAgICBjb2RpZ28gPT0gIjg3NDA5OTAwIiB+ICJQTTciDQogICAgKQ0KICApICU+JSANCiAgc2VsZWN0KGNvZGlnbywgcG9udG9fbW9uaXRvcmFtZW50bywgZXZlcnl0aGluZygpKSAjcmVvcmRlbmFuZG8gY29sdW5hcw0KIyB0ZXN0ZSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQojICAgZHBseXI6OmZpbHRlcihkYXRhX2NvbGV0YSA+PSBhcy5QT1NJWGN0KCIyMDEwLTAxLTAxIikpICN0aGlzIHdvcmtzDQpgYGANCg0KYGBge3IgVmlzdWFsaXphw6fDo28gZGEgcGxhbmlsaGEgaW1wb3J0YWRhLCBlY2hvID0gRkFMU0V9DQpwYWdlZF90YWJsZShwbGFuX3dpZGVfMTk5MDIwMjAsDQogICAgICAgICAgICBvcHRpb25zID0gbGlzdChyb3dzLnByaW50ID0gMTUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzLnByaW50ID0gMTApKQ0KYGBgDQoNCiMgZGF0YSB3cmFuZ2xpbmcNCg0KQ29tbyBow6EgZGFkb3MgZmFsdGFudGVzLCBubyBjw6FsY3VsbyBlbnRyZSBvIHByb2R1dG8gZGFzIGNvbHVuYXMsIG8gUiBhY2FiYSBpbnRlcnByZXRhbmRvIGNvbW8gc2UgZm9zc2UgemVybywgbWFzIG5hIHZlcmRhZGUgw6kgYE5BYC4NCg0KYGBge3IgZGF0YSB3cmFuZ2xpbmd9DQpwbGFuX3dpZGVfMTk5MDIwMjAgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgIG11dGF0ZShpcWEgPSBpZmVsc2UoaXFhID09IDAsIE5BLCBpcWEpKQ0KDQpwYXJhbWV0cm9zX0lRQSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogIHNlbGVjdCgNCiAgICBjb2RpZ28sDQogICAgcG9udG9fbW9uaXRvcmFtZW50bywNCiAgICBwSCwNCiAgICBveGlnZW5pb19kaXNzb2x2aWRvLA0KICAgIGRibywNCiAgICBmb3Nmb3JvX3RvdGFsLA0KICAgIGVzY2hlcmljaGlhX2NvbGksDQogICAgbml0cm9nZW5pb19hbW9uaWFjYWwsDQogICAgbml0cm9nZW5pb19ramVsZGFobCwNCiAgICBuaXRyb2dlbmlvX3RvdGFsLA0KICAgIHR1cmJpZGV6LA0KICAgIHRlbXBlcmF0dXJhX2FndWEsDQogICAgc29saWRvc190b3RhaXMsDQogICAgY29uZHV0aXZpZGFkZSwNCiAgICBhbm9fY29sZXRhDQogICkNCg0Kd3JpdGUuY3N2KHBhcmFtZXRyb3NfSVFBLA0KICAgICAgICAgICIuL3BhcmFtZXRyb3NfSVFBLmNzdiIsDQogICAgICAgICAgcm93Lm5hbWVzID0gRkFMU0UpDQoNCnBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogIHNlbGVjdChzdGFydHNfd2l0aCgiaXFhXyIpKSAlPiUgDQogIG11dGF0ZSgNCiAgICB0ZXN0ZV9pcWFfY2FsYyA9IHByb2QoKSAjcXVlcmlhIHRlbnRhciBnZXJhciBvIHByb2R1dMOzcmlvIGVudHJlIGFzIGNvbHVuYXMgcXVlIGrDoSBwb3NzdWVtIG8gSVFBXjINCiAgKQ0KYGBgDQoNCmBgYHtyIEPDs2RpZ29zIEdpdCwgZWNobyA9IEZBTFNFfQ0KIyBjZCBteXJlcG8NCiMgbHMNCiMgaGVhZCBSRUFETUUubWQNCiMgZ2l0IHN0YXR1cw0KIyBnaXQgYWRkIFJFQURNRS5tZA0KIyBnaXQgY29tbWl0IC1tICJBIGNvbW1pdCBmcm9tIG15IGxvY2FsIGNvbXB1dGVyIg0KIyANCiMgY2QgLi4gIyB2b2x0YXIgcHJvIGRpcmV0w7NyaW8gYWNpbWENCiMgcm0gLXJmIG15cmVwby8gI3JlbW92ZXIvYXBhZ2FyIGEgcGFzdGEgbXlyZXBvDQpgYGANCg0KYGBge3IgQXByZW5kZW5kbyBHaXQsIGVjaG8gPSBGQUxTRX0NCiMgc2xpZGVzIGRhIGJpYSBxdWUgYWp1ZGFtIG10DQojIGh0dHBzOi8vYmVhdHJpem1pbHouZ2l0aHViLmlvL3NsaWRlc1IvZ2l0X3JzdHVkaW8vMTEtMjAyMS1FTkNFLmh0bWwjMjANCiMgYXByZW5kZW5kbyBhIHNpbmNyb25pemFyIHVzYW5kbyBlc3NlIGd1aWEgLT4gDQojIGh0dHBzOi8vaGFwcHlnaXR3aXRoci1jb20udHJhbnNsYXRlLmdvb2cvcHVzaC1wdWxsLWdpdGh1Yi5odG1sP194X3RyX3NsPWF1dG8mX3hfdHJfdGw9cHQmX3hfdHJfaGw9cHQtQlINCiMgbGlicmFyeSh1c2V0aGlzKQ0KIyB1c2V0aGlzOjpjcmVhdGVfZ2l0aHViX3Rva2VuKCkgY3JpYXIgdW0gY8OzZGlnbyBwcmEgYWNlc3NvIGUgc2luY3Jvbml6YcOnw6NvIGJldHdlZW4gUiBlIGdpdGh1Yg0KDQojIGdpdGNyZWRzOjpnaXRjcmVkc19zZXQoKSANCiMgDQojIHVzZV9naXRfY29uZmlnKHVzZXIubmFtZSA9ICJsZW9uYXJkb2Z3aW5rIiwNCiMgICAgICAgICAgICAgICAgdXNlci5lbWFpbCA9ICJsZW9uYXJkb2Z3aW5rQGdtYWlsLmNvbSIpDQojIHVzZXRoaXM6OmdoX3Rva2VuX2hlbHAoKQ0KDQojIENvbW8gbW9zdHJhciBvcyBkYWRvcyBkZSB1bSBhcnF1aXZvIHZpYSBHaXQvR2l0SHViDQojIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vbGVvbmFyZG9md2luay9teXJlcG8uZ2l0DQojIGNkIG15cmVwbyAjYWNlc3NhIGEgcGFzdGEgbXlyZXBvDQojIGxzICNsaXN0YSBvcyBhcnF1aXZvcyBkYSBwYXN0YSANCiMgaGVhZCBSRUFETUUubWQgI21vc3RyYSBhcyBwcmltZWlyYXMgb2JzZXJ2YcOnw7VlcyBkbyBhcnF1aXZvDQoNCiMgQ29tbyBtb3N0cmFyIG9zIGRhZG9zIGRlIHVtIGFycXVpdm8gdmlhIFINCiMgaGVhZChDOi9Vc2Vycy9Mw6lvL215cmVwby9SRUFETUUubWQpDQoNCiMgQWRpY2lvbmFyIHVtYSBsaW5oYSBhbyBSRUFETUUubWQgZSB2ZXJpZmljYXIgc2UgbyBHaXQgcGVyY2ViZSBhIG11ZGFuw6dhDQojIGVjaG8gIkEgbGluZSBJIHdyb3RlIG9uIG15IGxvY2FsIGNvbXB1dGVyIiA+PiBSRUFETUUubWQNCiMgZ2l0IHN0YXR1cw0KIyMgQzpcVXNlcnNcTMOpb1xteXJlcG8+Z2l0IHN0YXR1cw0KIyMgT24gYnJhbmNoIG1haW4NCiMjIFlvdXIgYnJhbmNoIGlzIHVwIHRvIGRhdGUgd2l0aCAnb3JpZ2luL21haW4nLg0KIyMgDQojIyBDaGFuZ2VzIG5vdCBzdGFnZWQgZm9yIGNvbW1pdDoNCiMjICAgKHVzZSAiZ2l0IGFkZCA8ZmlsZT4uLi4iIHRvIHVwZGF0ZSB3aGF0IHdpbGwgYmUgY29tbWl0dGVkKQ0KIyMgICAodXNlICJnaXQgcmVzdG9yZSA8ZmlsZT4uLi4iIHRvIGRpc2NhcmQgY2hhbmdlcyBpbiB3b3JraW5nIGRpcmVjdG9yeSkNCiMjICAgICAgICAgKiptb2RpZmllZDogICBSRUFETUUubWQqKg0KIyMgDQojIyBubyBjaGFuZ2VzIGFkZGVkIHRvIGNvbW1pdCAodXNlICJnaXQgYWRkIiBhbmQvb3IgImdpdCBjb21taXQgLWEiKQ0KYGBgDQoNCiMgc2V0dGluZyB0aGVtZQ0KDQpgYGB7ciBzZXR0aW5nIHRoZW1lfQ0KdGhlbWVfZ3JhZnMgPC0gZnVuY3Rpb24oYmcgPSAid2hpdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yYWNhb19sZXRyYSA9ICJibGFjayIpIHsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IA0KICAgICAgZWxlbWVudF90ZXh0KA0KICAgICAgICBoanVzdCA9IDAuNSwNCiAgICAgICAgY29sb3IgPSBjb2xvcmFjYW9fbGV0cmEsDQogICAgICAgIHNpemUgPSAxOSksDQogICAgDQogICAgYXhpcy50aXRsZS54ID0gDQogICAgICAjIGVsZW1lbnRfdGV4dCgNCiAgICAgICMgY29sb3IgPSBjb2xvcmFjYW9fbGV0cmEsDQogICAgICAjIHNpemUgPSAxNSwNCiAgICAgICMgYW5nbGUgPSAwLCksDQogICAgICBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KA0KICAgICAgY29sb3IgPSBjb2xvcmFjYW9fbGV0cmEsDQogICAgICBzaXplID0gMTUsDQogICAgICBhbmdsZSA9IDkwKSwNCiAgICANCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGNvbG9yID0gY29sb3JhY2FvX2xldHJhLA0KICAgICAgc2l6ZSA9IDE3KSwNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGNvbG9yID0gY29sb3JhY2FvX2xldHJhLA0KICAgICAgc2l6ZSA9IDE3LA0KICAgICAgYW5nbGUgPSAwKSwNCiAgICANCiAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBiZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAwLjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE3KSwNCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBiZyksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBiZyksDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4obCA9IDUsIHIgPSAxMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBiID0gNSwgdCA9IDUpDQogICkNCn0NCmBgYA0KDQojIHNldHRpbmcgZGlmZmVyZW50IHRpbWVzY2FsZXMNCg0KYGBge3Igc2V0dGluZyBwZXJpb2RvcywgZWNobyA9IEZBTFNFfQ0KcGxhbl93aWRlXzE5OTAyMDIwIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogIG11dGF0ZSgNCiAgICBwZXJpb2RvID0gaWZfZWxzZSgNCiAgICAgIGFub19jb2xldGEgPD0gMjAwMCwgDQogICAgICAiMTk5MC0yMDAwIiwNCiAgICAgIGlmX2Vsc2UoDQogICAgICAgIGFub19jb2xldGEgPD0gMjAxMCwNCiAgICAgICAgIjIwMDAtMjAxMCIsDQogICAgICAgICIyMDEwLTIwMjAiDQogICAgICApDQogICAgKQ0KICApDQpgYGANCg0KIyBzZXR0aW5nIHN1bWFyaWVzDQoNCmBgYHtyIFN1bcOhcmlvcywgZWNobyA9IEZBTFNFfQ0Kc3VtYXJpbyA8LSBmdW5jdGlvbihkYWRvcyA9IHBsYW5fd2lkZV8xOTkwMjAyMCwgcGFyYW1ldHJvID0gIiIpIHsNCiAgZGFkb3MgJT4lIA0KICAgICMgZmlsdGVyKGFub19jb2xldGE+IjE5OTAiICYNCiAgICAjICAgICAgICAgIGFub19jb2xldGE8PSIyMDAwIikgJT4lDQogICAgZ3JvdXBfYnkocG9udG9fbW9uaXRvcmFtZW50bykgJT4lDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0NCiAgICAgICAgbWluKHBhcmFtZXRybywNCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBwMDUgPSANCiAgICAgICAgcXVhbnRpbGUocGFyYW1ldHJvLCAwLjA1LA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcDIwID0NCiAgICAgICAgcXVhbnRpbGUocGFyYW1ldHJvLCAwLjIwLA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0NCiAgICAgICAgbWVkaWFuKHBhcmFtZXRybywNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWFuID0NCiAgICAgICAgbWVhbihwYXJhbWV0cm8sDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcDgwID0NCiAgICAgICAgcXVhbnRpbGUocGFyYW1ldHJvLCAwLjgwLA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcDk1ID0NCiAgICAgICAgcXVhbnRpbGUocGFyYW1ldHJvLCAwLjk1LA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0NCiAgICAgICAgbWF4KHBhcmFtZXRybywNCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCiAgICAgICkNCn0NCmBgYA0KDQoNCiMgRnVuw6fDtWVzIA0KIyMgY3JpYW5kbyBmdW7Dp8OjbyBwYXJhIGdlcmFyIGJveHBsb3RzIGNvbSBwZXJjZW50aWwgMjAgZSA4MA0KDQpgYGB7ciBmdW5jYW8gcGVyY2VudGlsIDgwfQ0KZiA8LSBmdW5jdGlvbih4KSB7DQogIHIgPC0gcXVhbnRpbGUoeCwgcHJvYnMgPSBjKDAuMDUsIDAuMjAsIDAuNTAsIDAuODAsIDAuOTUpKQ0KICBuYW1lcyhyKSA8LSBjKCJ5bWluIiwgImxvd2VyIiwgIm1pZGRsZSIsICJ1cHBlciIsICJ5bWF4IikNCiAgcmV0dXJuKHIpDQp9DQpgYGANCg0KIyMgY3JpYW5kbyBmdW7Dp8OjbyBwYXJhIGdlcmFyIGdyw6FmaWNvIGRlIG9kDQpgYGB7ciBnZXJhbmRvIGZ1bmN0aW9uIGdyYWYgb2QsIGVjaG8gPSBGQUxTRX0NCmJveHBsb3Rfb2QgPC0gZnVuY3Rpb24oZGFkb3MgPSBwbGFuX3dpZGVfMTk5MDIwMjAsIGVpeG9feCA9IGNvZGlnbywgZWl4b195ID0gb3hpZ2VuaW9fZGlzc29sdmlkbywgdGl0dWxvID0gIk94aWfDqm5pbyBEaXNzb2x2aWRvIil7DQogIGdncGxvdDI6OmdncGxvdCgNCiAgICBkYXRhID0gZGFkb3MsDQogICAgYWVzKA0KICAgICAgeCA9IHt7ZWl4b194fX0sDQogICAgICB5ID0ge3tlaXhvX3l9fQ0KICAgICkNCiAgKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsDQogICAgICAgICAgICAgeW1pbiA9IC1JbmYsIHltYXggPSAyLA0KICAgICAgICAgICAgIGFscGhhID0gMSwNCiAgICAgICAgICAgICBmaWxsID0gIiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluID0gLUluZiwgeG1heCA9IEluZiwNCiAgICAgICAgICAgICB5bWluID0gMiwgeW1heCA9IDQsDQogICAgICAgICAgICAgYWxwaGEgPSAxLA0KICAgICAgICAgICAgIGZpbGwgPSAiI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsDQogICAgICAgICAgICAgeW1pbiA9IDQsIHltYXggPSA1LA0KICAgICAgICAgICAgIGFscGhhID0gMSwNCiAgICAgICAgICAgICBmaWxsID0gIiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLA0KICAgICAgICAgICAgIHltaW4gPSA1LCB5bWF4ID0gNiwNCiAgICAgICAgICAgICBhbHBoYSA9IDEsDQogICAgICAgICAgICAgZmlsbCA9ICIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluID0gLUluZiwgeG1heCA9IEluZiwNCiAgICAgICAgICAgICB5bWluPSA2LCB5bWF4ID0gSW5mLA0KICAgICAgICAgICAgIGFscGhhID0gMSwNCiAgICAgICAgICAgICBmaWxsID0gIiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICAgc3RhdF9zdW1tYXJ5KA0KICAgICAgZnVuLmRhdGEgPSBmLA0KICAgICAgZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICB3aWR0aCA9IDAuMywNCiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICApKw0KICAgIHN0YXRfc3VtbWFyeSgNCiAgICAgIGZ1bi5kYXRhID0gZiwNCiAgICAgIGdlb20gPSAiYm94cGxvdCIsDQogICAgICB3aWR0aCA9IDAuNywNCiAgICAgIGZpbGwgPSAnI0Y4RjhGRicsDQogICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICApKw0KICAgICMgZmFjZXRfd3JhcCh+cGVyaW9kbykrDQogICAgbGFicygNCiAgICAgIHRpdGxlID0gdGl0dWxvLA0KICAgICAgeD0gTlVMTCwNCiAgICAgIHk9Im1nL0wiDQogICAgKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgIGFscGhhID0gLjI1LA0KICAgICAgd2lkdGggPSAuMDcsDQogICAgKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoDQogICAgICBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgICBuLmJyZWFrcyA9IDExLA0KICAgICAgbGltaXRzID0gYygtMC4zLDIxKQ0KICAgICkrDQogICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICApKw0KICAgIGdlb21fc21vb3RoKA0KICAgICAgbWV0aG9kID0gImxtIiwNCiAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgYWVzKGdyb3VwID0gMSksDQogICAgICBhbHBoYSA9IC41LA0KICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgc2l6ZSA9IDENCiAgICApKw0KICAgIHRoZW1lX2dyYWZzKCkNCn0NCmBgYA0KDQojIyBjcmlhbmRvIGZ1bsOnw6NvIHBhcmEgZ2VyYXIgZ3LDoWZpY28gZGUgZGJvDQpgYGB7ciBnZXJhbmRvIGZ1bmN0aW9uIGdyYWYgZGJvLCBlY2hvID0gRkFMU0V9DQpib3hwbG90X2RibyA8LSBmdW5jdGlvbihkYWRvcyA9IHBsYW5fd2lkZV8xOTkwMjAyMCwgZWl4b194ID0gY29kaWdvLCBlaXhvX3kgPSBkYm8sIHRpdHVsbyA9ICJEZW1hbmRhIEJpb3F1w61taWNhIGRlIE94aWfDqm5pbyIpew0KICBnZ3Bsb3QyOjpnZ3Bsb3QoDQogICAgZGF0YSA9IGRhZG9zLA0KICAgIGFlcygNCiAgICAgIHggPSB7e2VpeG9feH19LA0KICAgICAgeSA9IHt7ZWl4b195fX0NCiAgICApDQogICkrDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0xMCwgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLCB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTUsIHltYXg9MTAsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MywgeW1heD01LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLCB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTAsIHltYXg9MywNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICAgc3RhdF9zdW1tYXJ5KA0KICAgICAgZnVuLmRhdGEgPSBmLA0KICAgICAgZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICB3aWR0aCA9IDAuMywNCiAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICApKw0KICAgIHN0YXRfc3VtbWFyeSgNCiAgICAgIGZ1bi5kYXRhID0gZiwNCiAgICAgIGdlb20gPSAiYm94cGxvdCIsDQogICAgICB3aWR0aCA9IDAuNywNCiAgICAgIGZpbGwgPSAnI0Y4RjhGRicsDQogICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICApKw0KICAgICMgZmFjZXRfd3JhcCh+cGVyaW9kbykrDQogICAgbGFicyh0aXRsZSA9IHRpdHVsbywNCiAgICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgICB5PSJtZy9MIiwNCiAgICAgICAgIGNhcHRpb24gPSAiTGVvbmFyZG8gRmVybmFuZGVzIFdpbmsiDQogICAgKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgIGFscGhhID0gLjI1LA0KICAgICAgd2lkdGggPSAuMDcsDQogICAgKSsNCiAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgICkrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAzLDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEsMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkNCn0NCmBgYA0KDQojIyBQdG90DQpgYGB7ciBnZXJhbmRvIGZ1bmN0aW9uIGdyYWYgcHRvdCwgZWNobyA9IEZBTFNFfQ0KYm94cGxvdF9wdG90IDwtIGZ1bmN0aW9uKGRhZG9zID0gcGxhbl93aWRlXzE5OTAyMDIwLCBlaXhvX3ggPSBjb2RpZ28sIGVpeG9feSA9IGZvc2Zvcm9fdG90YWwsIHRpdHVsbyA9ICJGw7NzZm9ybyB0b3RhbCIpew0KICBnZ3Bsb3QyOjpnZ3Bsb3QoDQogICAgZGF0YSA9IGRhZG9zLA0KICAgIGFlcygNCiAgICAgIHggPSB7e2VpeG9feH19LA0KICAgICAgeSA9IHt7ZWl4b195fX0NCiAgICApDQogICkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MC4xNSwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAuMSwNCiAgICAgICAgICAgIHltYXg9MC4xNSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTAuMSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICBzdGF0X3N1bW1hcnkoDQogICAgIGZ1bi5kYXRhID0gZiwNCiAgICAgZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgIHdpZHRoID0gMC4zLA0KICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICApKw0KICAgc3RhdF9zdW1tYXJ5KA0KICAgICBmdW4uZGF0YSA9IGYsDQogICAgIGdlb20gPSAiYm94cGxvdCIsDQogICAgIHdpZHRoID0gMC43LA0KICAgICBmaWxsID0gJyNGOEY4RkYnLA0KICAgICBjb2xvciA9ICJibGFjayIsDQogICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgKSsNCiAgICBsYWJzKHRpdGxlID0gdGl0dWxvLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9Im1nL0wiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMywwLjAzKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRmb3Nmb3JvX3RvdGFsLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRmb3Nmb3JvX3RvdGFsKSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIsDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gLjAwMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikNCiAgICAgICAgICAgICAgICAgICAgICApKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgICBhbHBoYSA9IC4yNSwNCiAgICAgICB3aWR0aCA9IC4wNywNCiAgICApKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkNCn0NCmBgYA0KDQojIyBFIGNvbGkNCmBgYHtyIGZ1bmNhby1ncmFmLWVjb2xpLCBlY2hvID0gRkFMU0V9DQpib3hwbG90X2Vjb2xpIDwtIGZ1bmN0aW9uKGRhZG9zID0gcGxhbl93aWRlXzE5OTAyMDIwLCBlaXhvX3ggPSBjb2RpZ28sIGVpeG9feSA9IGVzY2hlcmljaGlhX2NvbGksIHRpdHVsbyA9ICIqRXNjaGVyaWNoaWEgY29saSoiKXsNCiAgZ2dwbG90Mjo6Z2dwbG90KA0KICAgIGRhdGEgPSBkYWRvcywNCiAgICBhZXMoDQogICAgICB4ID0ge3tlaXhvX3h9fSwNCiAgICAgIHkgPSB7e2VpeG9feX19DQogICAgKQ0KICApKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLCB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MzIwMCwgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj04MDAsIHltYXg9MzIwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLCB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MTYwLCB5bWF4PTgwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLCB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MCwgeW1heD0xNjAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfc3VtbWFyeSgNCiAgICAgZnVuLmRhdGEgPSBmLA0KICAgICBnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgd2lkdGggPSAwLjMsDQogICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICkrDQogICBzdGF0X3N1bW1hcnkoDQogICAgIGZ1bi5kYXRhID0gZiwNCiAgICAgZ2VvbSA9ICJib3hwbG90IiwNCiAgICAgd2lkdGggPSAwLjcsDQogICAgIGZpbGwgPSAnI0Y4RjhGRicsDQogICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICApKw0KICAgIyBmYWNldF93cmFwKH5wZXJpb2RvKSsNCiAgIGxhYnModGl0bGUgPSB0aXR1bG8sDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9Ik5NUC8xMDBtTCIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjAxKSksDQogICAgICAgICAgICAgICAgICAgICAgIyBuLmJyZWFrcyA9IDksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRlc2NoZXJpY2hpYV9jb2xpLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRlc2NoZXJpY2hpYV9jb2xpLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIsDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkrDQogICAgdGhlbWUoDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KA0KICAgICAgICAgIGFuZ2xlID0gOTAsIA0KICAgICAgICAgICMgc2l6ZT0xNSwNCiAgICAgICAgICAjIGZhY2U9Mg0KICAgICAgICApLA0KICAgICAgICBwbG90LnRpdGxlID0gDQogICAgICAgICAgZWxlbWVudF9tYXJrZG93bigNCiAgICAgICAgICAgIGhqdXN0ID0gMC41LA0KICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgc2l6ZSA9IDE5KQ0KICAgICkNCn0NCmBgYA0KDQojIyBOaXRyb2fDqm5pbyBBbW9uaWFjYWwNCmBgYHtyfQ0KYm94cGxvdF9uYW1vbiA8LSBmdW5jdGlvbihkYWRvcyA9IHBsYW5fd2lkZV8xOTkwMjAyMCwgZWl4b194ID0gY29kaWdvLCBlaXhvX3kgPSBuaXRyb2dlbmlvX2Ftb25pYWNhbCwgdGl0dWxvID0gIk5pdHJvZ8OqbmlvIEFtb25pYWNhbCIpew0KICBnZ3Bsb3QyOjpnZ3Bsb3QoDQogICAgZGF0YSA9IGRhZG9zLA0KICAgIGFlcygNCiAgICAgIHggPSB7e2VpeG9feH19LA0KICAgICAgeSA9IHt7ZWl4b195fX0NCiAgICApDQogICkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MTMuMywNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTMuNywNCiAgICAgICAgICAgIHltYXg9MTMuMywNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTMuNywNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9zdW1tYXJ5KA0KICAgICBmdW4uZGF0YSA9IGYsDQogICAgIGdlb20gPSAnZXJyb3JiYXInLA0KICAgICB3aWR0aCA9IDAuMywNCiAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgKSsNCiAgIHN0YXRfc3VtbWFyeSgNCiAgICAgZnVuLmRhdGEgPSBmLA0KICAgICBnZW9tID0gImJveHBsb3QiLA0KICAgICB3aWR0aCA9IDAuNywNCiAgICAgZmlsbCA9ICcjRjhGOEZGJywNCiAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICkrDQogICAjIGZhY2V0X3dyYXAofnBlcmlvZG8pKw0KICAgbGFicyh0aXRsZSA9IHRpdHVsbywNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0ibWcvTCIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA5LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRuaXRyb2dlbmlvX2Ftb25pYWNhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkbml0cm9nZW5pb19hbW9uaWFjYWwsIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAuMDAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KfQ0KYGBgDQoNCiMjIFR1cmJpZGV6DQoNCmBgYHtyfQ0KYm94cGxvdF90dXJiIDwtIGZ1bmN0aW9uKGRhZG9zID0gcGxhbl93aWRlXzE5OTAyMDIwLCBlaXhvX3ggPSBjb2RpZ28sIGVpeG9feSA9IHR1cmJpZGV6LCB0aXR1bG8gPSAiVHVyYmlkZXoiKXsNCiAgZ2dwbG90Mjo6Z2dwbG90KA0KICAgIGRhdGEgPSBkYWRvcywNCiAgICBhZXMoDQogICAgICB4ID0ge3tlaXhvX3h9fSwNCiAgICAgIHkgPSB7e2VpeG9feX19DQogICAgKQ0KICApKw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MTAwLCB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj00MCwgeW1heD0xMDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsIHltYXg9NDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfc3VtbWFyeSgNCiAgICAgZnVuLmRhdGEgPSBmLA0KICAgICBnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgd2lkdGggPSAwLjMsDQogICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICkrDQogICBzdGF0X3N1bW1hcnkoDQogICAgIGZ1bi5kYXRhID0gZiwNCiAgICAgZ2VvbSA9ICJib3hwbG90IiwNCiAgICAgd2lkdGggPSAwLjcsDQogICAgIGZpbGwgPSAnI0Y4RjhGRicsDQogICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICApKw0KICAgbGFicyh0aXRsZSA9IHRpdHVsbywNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iVU5UIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDUsIDAuMDUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygNCiAgICAgICAgICAgICAgICAgICAgICAgICMgMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkdHVyYmlkZXosIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAjIDUwMA0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCR0dXJiaWRleiwgbmEucm0gPSBUUlVFKQ0KICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkNCn0NCg0KYGBgDQoNCg0KIyMgcEgNCg0KIyMgU8OzbGlkb3MgVG90YWlzDQoNCiMjIENvbmR1dGl2aWRhZGUNCg0KIyBQYXLDom1ldHJvcyBmw61zaWNvLXF1w61taWNvcw0KDQojIyMgT3hpZ8OqbmlvIERpc3NvbHZpZG8NCg0KYGBge3IgR3LDoWZpY28gT0QgZmFjZXR0ZWQsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcuY2FwPSJPeGlnw6puaW8gRGlzc29sdmlkbyBubyBwZXLDrW9kbyAxOTkwLTIwMjAifQ0KKG9kIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICBib3hwbG90X29kKA0KICAgICB0aXR1bG8gPSAiT3hpZ8OqbmlvIERpc3NvbHZpZG8gbm8gcGVyw61vZG8gMTk5MC0yMDIwIg0KICAgKSsNCiAgIGZhY2V0X3dyYXAofnBlcmlvZG8pDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gT0QgcGVyaW9kbyAxLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLmNhcD0iT3hpZ8OqbmlvIERpc3NvbHZpZG8gbm8gcGVyw61vZG8gMTk5MC0yMDAwIn0NCihvZF9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgZmlsdGVyKGFub19jb2xldGEgPiAiMTk5MCIgJg0KICAgICAgICAgICAgYW5vX2NvbGV0YSA8PSAiMjAwMCIpICU+JSANCiAgIGJveHBsb3Rfb2QoDQogICAgIHRpdHVsbyA9ICJPeGlnw6puaW8gRGlzc29sdmlkbyBubyBwZXLDrW9kbyAxOTkwLTIwMDAiDQogICApDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gT0QgcGVyaW9kbyAyLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihvZF9wMiA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgZmlsdGVyKGFub19jb2xldGEgPiAiMjAwMCIgJg0KICAgICAgICAgICAgYW5vX2NvbGV0YSA8PSAiMjAxMCIpICU+JSANCiAgIGJveHBsb3Rfb2QoDQogICAgIHRpdHVsbyA9ICJPeGlnw6puaW8gRGlzc29sdmlkbyBubyBwZXLDrW9kbyAyMDAwLTIwMTAiDQogICApDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gT0QgcGVyaW9kbyAzLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihvZF9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgZmlsdGVyKGFub19jb2xldGEgPiAiMjAxMCIgJg0KICAgICAgICAgICAgYW5vX2NvbGV0YSA8PSAiMjAyMCIpICU+JSANCiAgIGJveHBsb3Rfb2QoDQogICAgIHRpdHVsbyA9ICJPeGlnw6puaW8gRGlzc29sdmlkbyBubyBwZXLDrW9kbyAyMDEwLTIwMjAiDQogICApDQopDQpgYGANCg0KYGBge3IgU2FsdmFuZG8gT0QsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSx9DQpnZ3NhdmUoIm9kLnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSBvZCwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJvZF9wMS5wbmciLA0KICAgICAgIHBsb3QgPSBvZF9wMSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJvZF9wMi5wbmciLA0KICAgICAgIHBsb3QgPSBvZF9wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJvZF9wMy5wbmciLA0KICAgICAgIHBsb3QgPSBvZF9wMywNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBJUUEgT0QgcGVyaW9kbzEsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCihpcWFvZF9wMSA8LWdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhbm9fY29sZXRhID4gIjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YSA8PSAiMjAwMCIpLA0KICAgICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICAgIGlxYV9vZCwgbmEucm0gPSBUUlVFKSkrDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICAgeW1heD0xOSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0xOSwNCiAgICAgICAgICAgICB5bWF4PTM2LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MzYsDQogICAgICAgICAgICAgeW1heD01MSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTUxLA0KICAgICAgICAgICAgIHltYXg9NzksDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj03OSwNCiAgICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X3N1bW1hcnkoDQogICAgIGZ1bi5kYXRhID0gZiwNCiAgICAgZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgIHdpZHRoID0gMC4zLA0KICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICApKw0KICAgc3RhdF9zdW1tYXJ5KA0KICAgICBmdW4uZGF0YSA9IGYsDQogICAgIGdlb20gPSAiYm94cGxvdCIsDQogICAgIHdpZHRoID0gMC43LA0KICAgICBmaWxsID0gJyNGOEY4RkYnLA0KICAgICBjb2xvciA9ICJibGFjayIsDQogICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgKSsNCiAgIGxhYnModGl0bGUgPSAiVmFyaWHDp8OjbyBkbyBJUUEgcGFyYSBvIHBhcsOibWV0cm8gT3hpZ8OqbmlvIERpc3NvbHZpZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9IiIpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgICBhbHBoYSA9IC4yNSwNCiAgICAgICB3aWR0aCA9IC4wNywNCiAgICApKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDYsDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMTAxKSkrDQogICAgZ2VvbV9zbW9vdGgoDQogICAgICAgbWV0aG9kID0gImxtIiwNCiAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgYWxwaGE9LjUsDQogICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgIHNpemUgPSAxDQogICAgKSsNCiAgICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gSVFBIE9EIHBlcmlvZG8yLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooaXFhb2RfcDIgPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYW5vX2NvbGV0YSA+ICIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGEgPD0gIjIwMTAiKSwNCiAgICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICAgICBpcWFfb2QsIG5hLnJtID0gVFJVRSkpKw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgIHltYXg9MTksDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MTksDQogICAgICAgICAgICAgeW1heD0zNiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTM2LA0KICAgICAgICAgICAgIHltYXg9NTEsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj01MSwNCiAgICAgICAgICAgICB5bWF4PTc5LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NzksDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNywNCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgICBsYWJzKHRpdGxlID0gIlZhcmlhw6fDo28gZG8gSVFBIHBhcmEgbyBwYXLDom1ldHJvIE94aWfDqm5pbyBEaXNzb2x2aWRvIDIwMDAtMjAxMCIsDQogICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICAgeT0iIikrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgICBzaXplID0gMS4yLA0KICAgICAgIGFscGhhID0gLjI1LA0KICAgICAgIHdpZHRoID0gLjA3LA0KICAgICkrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBnZW9tX3Ntb290aCgNCiAgICAgICBtZXRob2QgPSAibG0iLA0KICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICBhbHBoYT0uNSwNCiAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgc2l6ZSA9IDENCiAgICApKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCg0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIElRQSBPRCBwZXJpb2RvMywgZWNobyA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooaXFhb2RfcDMgPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYW5vX2NvbGV0YSA+ICIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGEgPD0gIjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICAgICBpcWFfb2QsIG5hLnJtID0gVFJVRSkpKw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgIHltYXg9MTksDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MTksDQogICAgICAgICAgICAgeW1heD0zNiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTM2LA0KICAgICAgICAgICAgIHltYXg9NTEsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj01MSwNCiAgICAgICAgICAgICB5bWF4PTc5LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NzksDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNywNCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgICBsYWJzKHRpdGxlID0gIlZhcmlhw6fDo28gZG8gSVFBIHBhcmEgbyBwYXLDom1ldHJvIE94aWfDqm5pbyBEaXNzb2x2aWRvIDIwMTAtMjAyMCIsDQogICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICAgeT0iIikrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgICBzaXplID0gMS4yLA0KICAgICAgIGFscGhhID0gLjI1LA0KICAgICAgIHdpZHRoID0gLjA3LA0KICAgICkrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBnZW9tX3Ntb290aCgNCiAgICAgICBtZXRob2QgPSAibG0iLA0KICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICBhbHBoYT0uNSwNCiAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgc2l6ZSA9IDENCiAgICApKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBTdW3DoXJpbyBPRCwgZWNobyA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KKHN1bV9vZF9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgb3hpZ2VuaW9fZGlzc29sdmlkbywgYW5vX2NvbGV0YSkgJT4lIA0KICAgIGZpbHRlcihhbm9fY29sZXRhID4gIjE5OTAiICYNCiAgICAgICAgICAgICBhbm9fY29sZXRhIDw9ICIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoY29kaWdvKSAlPiUgDQogICAjIGNvZGlnbyA9PSAiODczOTg1MDAiIDwtICJ0ZXN0ZTEiDQogICAgIyAlPiUgDQogc3VtbWFyaXplKA0KICAgICAgIG1heCA9IA0KICAgICAgICAgbWF4KG94aWdlbmlvX2Rpc3NvbHZpZG8sIG5hLnJtID0gVFJVRSksDQogICAgICAgcDk1ID0gDQogICAgICAgICBxdWFudGlsZShveGlnZW5pb19kaXNzb2x2aWRvLCAwLjk1LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgIHA4MCA9IA0KICAgICAgICAgcXVhbnRpbGUob3hpZ2VuaW9fZGlzc29sdmlkbywgMC44MCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICBtZWRpYW4gPSANCiAgICAgICAgIG1lZGlhbihveGlnZW5pb19kaXNzb2x2aWRvLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgIG1lYW4gPSANCiAgICAgICAgIG1lYW4ob3hpZ2VuaW9fZGlzc29sdmlkbywgbmEucm09IFRSVUUpLA0KICAgICAgIHAyMCA9IA0KICAgICAgICAgcXVhbnRpbGUob3hpZ2VuaW9fZGlzc29sdmlkbywgMC4yMCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICBwMDUgPSANCiAgICAgICAgIHF1YW50aWxlKG94aWdlbmlvX2Rpc3NvbHZpZG8sIDAuMDUsIG5hLnJtID0gVFJVRSksDQogICAgICAgbWluID0gDQogICAgICAgICBtaW4ob3hpZ2VuaW9fZGlzc29sdmlkbywgbmEucm0gPSBUUlVFKSwNCiAgICAgICBuID0gDQogICAgICAgICBsZW5ndGgob3hpZ2VuaW9fZGlzc29sdmlkbykNCiApICU+JSANCiAgICBwaXZvdF9sb25nZXIoDQogICAgICAgIWNvZGlnbywNCiAgICAgICBuYW1lc190byA9ICJwYXIiLA0KICAgICAgIHZhbHVlc190byA9ICJ2YWxvciINCiAgICApICU+JSANCiAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gY29kaWdvLA0KICAgICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gdmFsb3IpICU+JSANCiAgIHJlbmFtZSgNCiAgICAgIlBNMSIgPSAiODczOTg1MDAiLA0KICAgICAiUE0yIiA9ICI4NzM5ODkwMCIsDQogICAgICJQTTMiID0gIjg3Mzk4OTUwIiwNCiAgICAgIlBNNCIgPSAiODczOTg5ODAiLA0KICAgICAiUE01IiA9ICI4NzQwNTUwMCIsDQogICAgICJQTTYiID0gIjg3NDA2OTAwIiwNCiAgICAgIlBNNyIgPSAiODc0MDk5MDAiDQogICApIA0KICkNCg0KIyB0ZXN0ZTEgPC0gcGFyYW1ldHJvc19JUUEgJT4lIA0KIyAgIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KIyAgIHBpdm90X2xvbmdlcigNCiMgICAgICFjb2RpZ28sDQojICAgICBuYW1lc190byA9ICJwYXJhbWV0cm8iLA0KIyAgICAgdmFsdWVzX3RvID0gInZhbG9yIg0KIyAgICkgJT4lIA0KIyAgICMgZ3JvdXBfYnkocGFyYW1ldHJvKQ0KIyAgIHBpdm90X3dpZGVyKA0KIyAgICAgbmFtZXNfZnJvbSA9IGNvZGlnbywNCiMgICAgIHZhbHVlc19mcm9tID0gdmFsb3IsDQojICAgICAjIC5ncm91cHMgPSAiZHJvcCINCiMgICApICU+JSANCiMgICByZW5hbWUoDQojICAgICAiUE0xIiA9ICI4NzM5ODUwMCIsDQojICAgICAiUE0yIiA9ICI4NzM5ODkwMCIsDQojICAgICAiUE0zIiA9ICI4NzM5ODk1MCIsDQojICAgICAiUE00IiA9ICI4NzM5ODk4MCIsDQojICAgICAiUE01IiA9ICI4NzQwNTUwMCIsDQojICAgICAiUE02IiA9ICI4NzQwNjkwMCIsDQojICAgICAiUE03IiA9ICI4NzQwOTkwMCINCiMgICApICU+JQ0KIyAgIHNlbGVjdChwYXIsIFBNMSwgUE0yLCBQTTMsIFBNNCwgUE01LCBQTTYsIFBNNykgJT4lIA0KIyAgIGZpbHRlcigNCiMgICAgIHBhciA9PSAicEgiDQojICAgKSANCiMgJT4lIA0KIyAgIHVubmVzdChkcGx5cjo6ZXZlcnl0aGluZygpKQ0KDQoNCiMgdGVzdGUxJFBNMVsyXQ0KDQojICU+JQ0KIyAgIHN1bW1hcml6ZSgNCiMgICAgIG1heCA9DQojICAgICAgIG1heChveGlnZW5pb19kaXNzb2x2aWRvLCBuYS5ybSA9IFRSVUUpLA0KIyAgICAgcTMgPQ0KIyAgICAgICBxdWFudGlsZShveGlnZW5pb19kaXNzb2x2aWRvLCAwLjc1LCBuYS5ybSA9IFRSVUUpLA0KIyAgICAgbWVkaWFuID0NCiMgICAgICAgbWVkaWFuKG94aWdlbmlvX2Rpc3NvbHZpZG8sIG5hLnJtID0gVFJVRSksDQojICAgICBtZWFuID0NCiMgICAgICAgbWVhbihveGlnZW5pb19kaXNzb2x2aWRvLCBuYS5ybT0gVFJVRSksDQojICAgICBxMSA9DQojICAgICAgIHF1YW50aWxlKG94aWdlbmlvX2Rpc3NvbHZpZG8sIDAuMjUsIG5hLnJtID0gVFJVRSksDQojICAgICBtaW4gPQ0KIyAgICAgICBtaW4ob3hpZ2VuaW9fZGlzc29sdmlkbywgbmEucm0gPSBUUlVFKSwNCiMgICAgIG4gPQ0KIyAgICAgICBsZW5ndGgob3hpZ2VuaW9fZGlzc29sdmlkbykNCiMgICAgICkNCiMgIyAgICAgDQojIA0KIyBzdW0oc3VtX29kX3AxJG4pDQoNCg0KDQooc3VtX29kX3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICAgIHNlbGVjdChjb2RpZ28sIG94aWdlbmlvX2Rpc3NvbHZpZG8sIGFub19jb2xldGEpICU+JSANCiAgICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDAwIiAmDQogICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMTAiKSAlPiUgDQogICAgICBncm91cF9ieShjb2RpZ28pICU+JSANCiAgICAgIHN1bW1hcml6ZSgNCiAgICAgICAgIG1pbiA9IA0KICAgICAgICAgICAgbWluKG94aWdlbmlvX2Rpc3NvbHZpZG8sIG5hLnJtID0gVFJVRSksDQogICAgICAgICBxMSA9IA0KICAgICAgICAgICAgcXVhbnRpbGUob3hpZ2VuaW9fZGlzc29sdmlkbywgMC4yNSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgIG1lZGlhbiA9IA0KICAgICAgICAgICAgbWVkaWFuKG94aWdlbmlvX2Rpc3NvbHZpZG8sIG5hLnJtID0gVFJVRSksDQogICAgICAgICBtZWFuID0gDQogICAgICAgICAgICBtZWFuKG94aWdlbmlvX2Rpc3NvbHZpZG8sIG5hLnJtPSBUUlVFKSwNCiAgICAgICAgIHEzID0gDQogICAgICAgICAgICBxdWFudGlsZShveGlnZW5pb19kaXNzb2x2aWRvLCAwLjc1LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgbWF4ID0gDQogICAgICAgICAgICBtYXgob3hpZ2VuaW9fZGlzc29sdmlkbywgbmEucm0gPSBUUlVFKQ0KICAgICAgKQ0KKQ0KDQooc3VtX29kX3AzIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICAgIHNlbGVjdChjb2RpZ28sIG94aWdlbmlvX2Rpc3NvbHZpZG8sIGFub19jb2xldGEpICU+JSANCiAgICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDEwIiAmDQogICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMjAiKSAlPiUgDQogICAgICBncm91cF9ieShjb2RpZ28pICU+JSANCiAgICAgIHN1bW1hcml6ZSgNCiAgICAgICAgIG1pbiA9IA0KICAgICAgICAgICAgbWluKG94aWdlbmlvX2Rpc3NvbHZpZG8sIG5hLnJtID0gVFJVRSksDQogICAgICAgICBxMSA9IA0KICAgICAgICAgICAgcXVhbnRpbGUob3hpZ2VuaW9fZGlzc29sdmlkbywgMC4yNSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgIG1lZGlhbiA9IA0KICAgICAgICAgICAgbWVkaWFuKG94aWdlbmlvX2Rpc3NvbHZpZG8sIG5hLnJtID0gVFJVRSksDQogICAgICAgICBtZWFuID0gDQogICAgICAgICAgICBtZWFuKG94aWdlbmlvX2Rpc3NvbHZpZG8sIG5hLnJtPSBUUlVFKSwNCiAgICAgICAgIHEzID0gDQogICAgICAgICAgICBxdWFudGlsZShveGlnZW5pb19kaXNzb2x2aWRvLCAwLjc1LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgbWF4ID0gDQogICAgICAgICAgICBtYXgob3hpZ2VuaW9fZGlzc29sdmlkbywgbmEucm0gPSBUUlVFKQ0KICAgICAgKQ0KKQ0KDQojICAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IGNvZGlnbywNCiMgICAgICAgICAgICAgICBuYW1lc19mcm9tID0gY29kaWdvLA0KIyAgICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gb3hpZ2VuaW9fZGlzc29sdmlkbykNCiMgDQojIA0KIyAgIGdyb3VwX2J5KGNvZGlnbykgJT4lDQojICAgZ2V0X3N1bW1hcnlfc3RhdHModHlwZSA9ICJjb21tb24iKSAlPiUNCiMgICBwaXZvdF93aWRlcihpZF9jb2xzID0gdmFyaWFibGUsDQojICAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9IGNvZGlnbywNCiMgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHZhcmlhYmxlJG94aWdlbmlvX2Rpc3NvbHZpZG8pDQojIA0KIyAjIGluc3RhbGwucGFja2FnZXMoImdncHViciIpDQojICMgbGlicmFyeShnZ3B1YnIpDQpgYGANCg0KIyMjIERlbWFuZGEgQmlvcXXDrW1pY2EgZGUgT3hpZ8OqbmlvDQoNCmBgYHtyIEdyw6FmaWNvIERCTyBmYWNldHRlZCwgZmlnLmNhcD0iRGVtYW5kYSBCaW9xdcOtbWljYSBkZSBPeGlnw6puaW8gbm8gcGVyw61vZG8gMTk5MC0yMDIwIn0NCihkYm8gPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCwNCiAgICAgICAgICAgICAgIGFlcyh4ID0gY29kaWdvLA0KICAgICAgICAgICAgICAgICAgIHkgPSBkYm8pKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xMCwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTUsDQogICAgICAgICAgICB5bWF4PTEwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MywNCiAgICAgICAgICAgIHltYXg9NSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTMsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfc3VtbWFyeSgNCiAgICAgZnVuLmRhdGEgPSBmLA0KICAgICBnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgd2lkdGggPSAwLjMsDQogICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICkrDQogICBzdGF0X3N1bW1hcnkoDQogICAgIGZ1bi5kYXRhID0gZiwNCiAgICAgZ2VvbSA9ICJib3hwbG90IiwNCiAgICAgd2lkdGggPSAwLjcsDQogICAgIGZpbGwgPSAnI0Y4RjhGRicsDQogICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICApKw0KICAgZmFjZXRfd3JhcCh+cGVyaW9kbykrDQogICBsYWJzKHRpdGxlID0gIkRlbWFuZGEgQmlvcXXDrW1pY2EgZGUgT3hpZ8OqbmlvIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9Im1nL0wiLA0KICAgICAgICAjIGNhcHRpb24gPSAiTGVvbmFyZG8gRmVybmFuZGVzIFdpbmsiDQogICAgICAgICkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMywwLjAzKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwxMDApLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIikrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBEQk8gcGVyw61vZG8xLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGRib19wMTwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGE+IjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMDAiKSwNCiAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICBkYm8pKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MTAsDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NSwNCiAgICAgICAgICAgICB5bWF4PTEwLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MywNCiAgICAgICAgICAgICB5bWF4PTUsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgIHltYXg9MywNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICAgbGFicyh0aXRsZSA9ICJEZW1hbmRhIEJpb3F1w61taWNhIGRlIE94aWfDqm5pbyBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9Im1nL0wiKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICAgIHNpemUgPSAxLjIsDQogICAgICAgYWxwaGEgPSAuMjUsDQogICAgICAgd2lkdGggPSAuMDcsDQogICAgKSsNCiAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgICkrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAzLDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEsMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBEQk8gcGVyw61vZG8yLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGRib19wMjwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGE+IjIwMDAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMTAiKSwNCiAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICBkYm8pKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MTAsDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NSwNCiAgICAgICAgICAgICB5bWF4PTEwLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTMsDQogICAgICAgICAgICB5bWF4PTUsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgeW1heD0zLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAiRGVtYW5kYSBCaW9xdcOtbWljYSBkZSBPeGlnw6puaW8gbm8gcGVyw61vZG8gMjAwMC0yMDEwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0ibWcvTCIpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgICkrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAzLDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEsMTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBEQk8gcGVyw61vZG8zLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGRib19wMzwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICBkYm8sIG5hLnJtPVRSVUUpKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MTAsDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NSwNCiAgICAgICAgICAgICB5bWF4PTEwLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MywNCiAgICAgICAgICAgICB5bWF4PTUsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgIHltYXg9MywNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICAgbGFicyh0aXRsZSA9ICJEZW1hbmRhIEJpb3F1w61taWNhIGRlIE94aWfDqm5pbyBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9Im1nL0wiKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICAgIHNpemUgPSAxLjIsDQogICAgICAgYWxwaGEgPSAuMjUsDQogICAgICAgd2lkdGggPSAuMDcsDQogICAgKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDMsMC4wMykpLA0KICAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwxMDApLA0KICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gSVFBIERCTyBwZXJpb2RvMSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihpcWFfZGJvMTwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgIGZpbHRlcihhbm9fY29sZXRhPiIxOTkwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDAwIiksDQogICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICAgIGlxYV9kYm8pKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD0xOSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xOSwNCiAgICAgICAgICAgIHltYXg9MzYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0zNiwNCiAgICAgICAgICAgIHltYXg9NTEsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MSwNCiAgICAgICAgICAgIHltYXg9NzksDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj03OSwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxKSkNCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAiVmFyaWHDp8OjbyBkbyBJUUEgcGFyYSBvIHBhcsOibWV0cm8gREJPIDE5OTAtMjAyMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9Im1nL0wiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBJUUEgREJPIHBlcmlvZG8yLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGlxYV9kYm8yPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwJT4lIA0KICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGE+IjIwMDAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm9fY29sZXRhPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgICAgYWVzKGNvZGlnbywNCiAgICAgICAgICAgICAgICAgICAgICBpcWFfZGJvKSkrDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICAgeW1heD0xOSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0xOSwNCiAgICAgICAgICAgICB5bWF4PTM2LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MzYsDQogICAgICAgICAgICAgeW1heD01MSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTUxLA0KICAgICAgICAgICAgIHltYXg9NzksDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj03OSwNCiAgICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxKSkNCiAgICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgIGxhYnModGl0bGUgPSAiVmFyaWHDp8OjbyBkbyBJUUEgcGFyYSBvIHBhcsOibWV0cm8gREJPIDIwMDAtMjAxMCIsDQogICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICAgeT0ibWcvTCIpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgICBhbHBoYSA9IC4yNSwNCiAgICAgICB3aWR0aCA9IC4wNywNCiAgICApKw0KICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMSwxMDEpKSsNCiAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgICkrDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gSVFBIERCTyBwZXJpb2RvMywgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihpcWFfZGJvMzwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCU+JSANCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICAgaXFhX2RibykpKw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgIHltYXg9MTksDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MTksDQogICAgICAgICAgICAgeW1heD0zNiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTM2LA0KICAgICAgICAgICAgIHltYXg9NTEsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj01MSwNCiAgICAgICAgICAgICB5bWF4PTc5LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NzksDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMSkpDQogICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgICBsYWJzKHRpdGxlID0gIlZhcmlhw6fDo28gZG8gSVFBIHBhcmEgbyBwYXLDom1ldHJvIERCTyAyMDEwLTIwMjAiLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9Im1nL0wiKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICAgIHNpemUgPSAxLjIsDQogICAgICAgYWxwaGEgPSAuMjUsDQogICAgICAgd2lkdGggPSAuMDcsDQogICAgKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDYsDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMTAxKSkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgICAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBTdW3DoXJpbyBEQk8sIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSx9DQooc3VtX2Rib19wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICBzZWxlY3QoY29kaWdvLCBkYm8sIGFub19jb2xldGEpICU+JSANCiAgIGZpbHRlcihhbm9fY29sZXRhPiIxOTkwIiAmDQogICAgICAgICAgICBhbm9fY29sZXRhPD0iMjAwMCIpICU+JSANCiAgIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICAgc3VtbWFyaXplKA0KICAgICBtaW4gPSANCiAgICAgICBtaW4oZGJvLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgcTEgPSANCiAgICAgICBxdWFudGlsZShkYm8sIDAuMjUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbihkYm8sIA0KICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWFuID0gDQogICAgICAgbWVhbihkYm8sIA0KICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICBxMyA9IA0KICAgICAgIHF1YW50aWxlKGRibywgMC43NSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KGRibywgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQopDQoNCihzdW1fZGJvX3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoY29kaWdvLCBkYm8sIGFub19jb2xldGEpICU+JSANCiAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAwMCIgJg0KICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oZGJvLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShkYm8sIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihkYm8sIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihkYm8sIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKGRibywgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KGRibywgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX2Rib19wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgZGJvLCBhbm9fY29sZXRhKSAlPiUgDQogICAgZmlsdGVyKGFub19jb2xldGE+IjIwMTAiICYNCiAgICAgICAgICAgICBhbm9fY29sZXRhPD0iMjAyMCIpICU+JSANCiAgICBncm91cF9ieShjb2RpZ28pICU+JSANCiAgICBzdW1tYXJpemUoDQogICAgICBtaW4gPSANCiAgICAgICAgbWluKGRibywgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUoZGJvLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oZGJvLCANCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWFuID0gDQogICAgICAgIG1lYW4oZGJvLCANCiAgICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZShkYm8sIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChkYm8sIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCmBgYA0KDQpgYGB7ciBTYWx2YW5kbyBEQk8sIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSx9DQpnZ3NhdmUoImRiby5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gZGJvLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImRib19wMS5wbmciLA0KICAgICAgIHBsb3QgPSBkYm9fcDEsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiZGJvX3AyLnBuZyIsDQogICAgICAgcGxvdCA9IGRib19wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJkYm9fcDMucG5nIiwNCiAgICAgICBwbG90ID0gZGJvX3AzLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KYGBgDQoNCiMjIyBGw7NzZm9ybyB0b3RhbA0KDQpgYGB7ciBHcsOhZmljbyBmw7NzZm9ybyB0b3RhbCBmYWNldHRlZCwgZmlnLmNhcD0iRsOzc2Zvcm8gdG90YWwgbm8gcGVyw61vZG8gMTk5MC0yMDIwIn0NCihwdG90IDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAsDQogICAgICAgICAgICAgICAgYWVzKGNvZGlnbywNCiAgICAgICAgICAgICAgICAgICAgZm9zZm9yb190b3RhbCkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAuMTUsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLjEsDQogICAgICAgICAgICB5bWF4PTAuMTUsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgeW1heD0wLjEsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgc3RhdF9zdW1tYXJ5KA0KICAgICBmdW4uZGF0YSA9IGYsDQogICAgIGdlb20gPSAnZXJyb3JiYXInLA0KICAgICB3aWR0aCA9IDAuMywNCiAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgKSsNCiAgIHN0YXRfc3VtbWFyeSgNCiAgICAgZnVuLmRhdGEgPSBmLA0KICAgICBnZW9tID0gImJveHBsb3QiLA0KICAgICB3aWR0aCA9IDAuNywNCiAgICAgZmlsbCA9ICcjRjhGOEZGJywNCiAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICkrDQogIGZhY2V0X3dyYXAofnBlcmlvZG8pKw0KICAgIGxhYnModGl0bGUgPSAiRsOzc2Zvcm8gdG90YWwgbm8gcGVyw61vZG8gMTk5MC0yMDIwIiwNCiAgICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgICB5PSJtZy9MIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDMsMC4wMykpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkZm9zZm9yb190b3RhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkZm9zZm9yb190b3RhbCksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IC4wMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpDQogICAgICAgICAgICAgICAgICAgICAgKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICAgIHNpemUgPSAxLjIsDQogICAgICAgYWxwaGEgPSAuMjUsDQogICAgICAgd2lkdGggPSAuMDcsDQogICAgKSsNCiAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgICkrDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gRsOzc2Zvcm8gdG90YWwgcGVyaW9kbzEsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHB0b3RfcDE8LWdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGE+IjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMDAiKSwNCiAgICAgICAgICAgICAgICAgYWVzKGNvZGlnbywNCiAgICAgICAgICAgICAgICAgICAgIGZvc2Zvcm9fdG90YWwpKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MC4xNSwNCiAgICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0wLjEsDQogICAgICAgICAgICAgeW1heD0wLjE1LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgICB5bWF4PTAuMSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICAgbGFicyh0aXRsZSA9ICJGw7NzZm9ybyB0b3RhbCBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9Im1nL0wiKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICAgIHNpemUgPSAxLjIsDQogICAgICAgYWxwaGEgPSAuMjUsDQogICAgICAgd2lkdGggPSAuMDcsDQogICAgKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDMsMC4wMykpLA0KICAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRmb3Nmb3JvX3RvdGFsLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkZm9zZm9yb190b3RhbCksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIikrDQogICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICApKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgICBzaXplID0gMSkrDQogICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KDQpgYGANCg0KYGBge3IgR3LDoWZpY28gRsOzc2Zvcm8gdG90YWwgcGVyaW9kbzIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHB0b3RfcDIgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm9fY29sZXRhPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICAgIGZvc2Zvcm9fdG90YWwpKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MC4xNSwNCiAgICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0wLjEsDQogICAgICAgICAgICAgeW1heD0wLjE1LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgICB5bWF4PTAuMSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICAgbGFicyh0aXRsZSA9ICJGw7NzZm9ybyB0b3RhbCBubyBwZXLDrW9kbyAyMDAwLTIwMTAiLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9Im1nL0wiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMywwLjAzKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRmb3Nmb3JvX3RvdGFsLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRmb3Nmb3JvX3RvdGFsKSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgICAgc2l6ZSA9IDEuMiwNCiAgICAgICBhbHBoYSA9IC4yNSwNCiAgICAgICB3aWR0aCA9IC4wNywNCiAgICApKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICAgKSsNCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgIHRoZW1lX2dyYWZzKCkNCikNCg0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIEbDs3Nmb3JvIHRvdGFsIHBlcmlvZG8zLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihwdG90X3AzIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICAgICBmb3Nmb3JvX3RvdGFsKSkrDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTAuMTUsDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MC4xLA0KICAgICAgICAgICAgIHltYXg9MC4xNSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICAgeW1heD0wLjEsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgIGxhYnModGl0bGUgPSAiRsOzc2Zvcm8gdG90YWwgbm8gcGVyw61vZG8gMjAxMC0yMDIwIiwNCiAgICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgICB5PSJtZy9MIikrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAzLDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkZm9zZm9yb190b3RhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJGZvc2Zvcm9fdG90YWwpLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgICB0aGVtZV9ncmFmcygpDQopDQoNCmBgYA0KDQpgYGB7ciBTdW3DoXJpbyBGw7NzZm9ybyB0b3RhbCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCihzdW1fcHRvdF9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgZm9zZm9yb190b3RhbCwgYW5vX2NvbGV0YSkgJT4lIA0KICAgZmlsdGVyKGFub19jb2xldGE+IjE5OTAiICYNCiAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoY29kaWdvKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihmb3Nmb3JvX3RvdGFsLCBuYS5ybSA9IFRSVUUpLA0KICAgICBxMSA9IA0KICAgICAgIHF1YW50aWxlKGZvc2Zvcm9fdG90YWwsIDAuMjUsIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbihmb3Nmb3JvX3RvdGFsLCBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWFuID0gDQogICAgICAgbWVhbihmb3Nmb3JvX3RvdGFsLCBuYS5ybT0gVFJVRSksDQogICAgIHEzID0gDQogICAgICAgcXVhbnRpbGUoZm9zZm9yb190b3RhbCwgMC43NSwgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KGZvc2Zvcm9fdG90YWwsIG5hLnJtID0gVFJVRSkpKQ0KDQooc3VtX3B0b3RfcDIgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChjb2RpZ28sIGZvc2Zvcm9fdG90YWwsIGFub19jb2xldGEpICU+JSANCiAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAwMCIgJg0KICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oZm9zZm9yb190b3RhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKGZvc2Zvcm9fdG90YWwsIDAuMjUsIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKGZvc2Zvcm9fdG90YWwsIG5hLnJtID0gVFJVRSksDQogICAgICBtZWFuID0gDQogICAgICAgIG1lYW4oZm9zZm9yb190b3RhbCwgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUoZm9zZm9yb190b3RhbCwgMC43NSwgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgoZm9zZm9yb190b3RhbCwgbmEucm0gPSBUUlVFKSkpDQoNCihzdW1fcHRvdF9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgZm9zZm9yb190b3RhbCwgYW5vX2NvbGV0YSkgJT4lIA0KICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDEwIiAmDQogICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMjAiKSAlPiUgDQogICAgZ3JvdXBfYnkoY29kaWdvKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihmb3Nmb3JvX3RvdGFsLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUoZm9zZm9yb190b3RhbCwgMC4yNSwgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oZm9zZm9yb190b3RhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihmb3Nmb3JvX3RvdGFsLCBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZShmb3Nmb3JvX3RvdGFsLCAwLjc1LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChmb3Nmb3JvX3RvdGFsLCBuYS5ybSA9IFRSVUUpKSkNCg0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIFB0b3QsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSx9DQpnZ3NhdmUoInB0b3QucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IHB0b3QsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgicHRvdF9wMS5wbmciLA0KICAgICAgIHBsb3QgPSBwdG90X3AxLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoInB0b3RfcDIucG5nIiwNCiAgICAgICBwbG90ID0gcHRvdF9wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJwdG90X3AzLnBuZyIsDQogICAgICAgcGxvdCA9IHB0b3RfcDMsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KIyMjIEVzY2hlcmljaGlhIGNvbGkNCg0KYGBge3IgR3LDoWZpY28gRWNvbGkgZmFjZXR0ZWQsIGZpZy5jYXA9IkVzY2hlcmljaGlhLWNvbGktZ3JhdmF0YcOtIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGVjb2xpIDwtIGJveHBsb3RfZWNvbGkoDQogIHRpdHVsbyA9ICIqRXNjaGVyaWNoaWEgY29saSogbm8gcGVyw61vZG8gMTk5MC0yMDIwIg0KKSsNCiAgZmFjZXRfd3JhcCh+cGVyaW9kbykNCikNCg0KKGVjb2xpIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAsDQogICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICBlc2NoZXJpY2hpYV9jb2xpKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0zMjAwLCB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTgwMCwgeW1heD0zMjAwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xNjAsIHltYXg9ODAwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLCB5bWF4PTE2MCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9zdW1tYXJ5KA0KICAgICBmdW4uZGF0YSA9IGYsDQogICAgIGdlb20gPSAnZXJyb3JiYXInLA0KICAgICB3aWR0aCA9IDAuMywNCiAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgKSsNCiAgIHN0YXRfc3VtbWFyeSgNCiAgICAgZnVuLmRhdGEgPSBmLA0KICAgICBnZW9tID0gImJveHBsb3QiLA0KICAgICB3aWR0aCA9IDAuNywNCiAgICAgZmlsbCA9ICcjRjhGOEZGJywNCiAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICkrDQogICBmYWNldF93cmFwKH5wZXJpb2RvKSsNCiAgIGxhYnModGl0bGUgPSAiKkVzY2hlcmljaGlhIGNvbGkqIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9Ik5NUC8xMDBtTCIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjAxKSksDQogICAgICAgICAgICAgICAgICAgICAgIyBuLmJyZWFrcyA9IDksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRlc2NoZXJpY2hpYV9jb2xpLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRlc2NoZXJpY2hpYV9jb2xpLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIsDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkrDQogICAgdGhlbWUoDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KA0KICAgICAgICAgIGFuZ2xlID0gOTAsIA0KICAgICAgICAgICMgc2l6ZT0xNSwNCiAgICAgICAgICAjIGZhY2U9Mg0KICAgICAgICApLA0KICAgICAgICBwbG90LnRpdGxlID0gDQogICAgICAgICAgZWxlbWVudF9tYXJrZG93bigNCiAgICAgICAgICAgIGhqdXN0ID0gMC41LA0KICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgc2l6ZSA9IDE5KQ0KICAgICkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBFY29saSBwZXJpb2RvMSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooZWNvbGlfcDEgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhbm9fY29sZXRhPiIxOTkwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm9fY29sZXRhPD0iMjAwMCIpLA0KICAgICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICAgICAgZXNjaGVyaWNoaWFfY29saSkpKw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0zMjAwLA0KICAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTgwMCwNCiAgICAgICAgICAgICB5bWF4PTMyMDAsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0xNjAsDQogICAgICAgICAgICAgeW1heD04MDAsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgIHltYXg9MTYwLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgICBsYWJzKHRpdGxlID0gIkVzY2hlcmljaGlhIGNvbGkgbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgICB5PSJOTVAvMTAwbUwiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wMSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkZXNjaGVyaWNoaWFfY29saSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkZXNjaGVyaWNoaWFfY29saSwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICAgIHNpemUgPSAxLjIsDQogICAgICAgYWxwaGEgPSAuMjUsDQogICAgICAgd2lkdGggPSAuMDcsDQogICAgKSsNCiAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgICkrDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gRWNvbGkgcGVyaW9kbzIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGVjb2xpX3AyIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMTAiKSwNCiAgICAgICAgICAgICAgICAgICAgYWVzKGNvZGlnbywNCiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2hlcmljaGlhX2NvbGkpKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MzIwMCwNCiAgICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj04MDAsDQogICAgICAgICAgICAgeW1heD0zMjAwLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MTYwLA0KICAgICAgICAgICAgIHltYXg9ODAwLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgICB5bWF4PTE2MCwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICAgbGFicyh0aXRsZSA9ICJFc2NoZXJpY2hpYSBjb2xpIG5vIHBlcsOtb2RvIDIwMDAtMjAxMCIsDQogICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICAgeT0iTk1QLzEwMG1MIikrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjAxKSksDQogICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGxhbl93aWRlXzE5OTAyMDIwJGVzY2hlcmljaGlhX2NvbGksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRlc2NoZXJpY2hpYV9jb2xpLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgICBzaXplID0gMSkrDQogICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIEVjb2xpIHBlcmlvZG8zLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihlY29saV9wMyA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDIwIiksDQogICAgICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICAgICBlc2NoZXJpY2hpYV9jb2xpKSkrDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTMyMDAsDQogICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49ODAwLA0KICAgICAgICAgICAgIHltYXg9MzIwMCwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTE2MCwNCiAgICAgICAgICAgICB5bWF4PTgwMCwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICAgeW1heD0xNjAsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgIGxhYnModGl0bGUgPSAiRXNjaGVyaWNoaWEgY29saSBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9Ik5NUC8xMDBtTCIpKw0KICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wMSkpLA0KICAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDksDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRlc2NoZXJpY2hpYV9jb2xpLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkZXNjaGVyaWNoaWFfY29saSwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgU3Vtw6FyaW8gRWNvbGksIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSx9DQooc3VtX2Vjb2xpX3AxIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoY29kaWdvLCBlc2NoZXJpY2hpYV9jb2xpLCBhbm9fY29sZXRhKSAlPiUgDQogICAgZmlsdGVyKGFub19jb2xldGE+IjE5OTAiICYNCiAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMDAiKSAlPiUgDQogICBncm91cF9ieShjb2RpZ28pICU+JSANCiAgIHN1bW1hcml6ZSgNCiAgICAgbWluID0gDQogICAgICAgbWluKGVzY2hlcmljaGlhX2NvbGksIA0KICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBxMSA9IA0KICAgICAgIHF1YW50aWxlKGVzY2hlcmljaGlhX2NvbGksIDAuMjUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbihlc2NoZXJpY2hpYV9jb2xpLCANCiAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWVhbiA9IA0KICAgICAgIG1lYW4oZXNjaGVyaWNoaWFfY29saSwgDQogICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgIHEzID0gDQogICAgICAgcXVhbnRpbGUoZXNjaGVyaWNoaWFfY29saSwgMC43NSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KGVzY2hlcmljaGlhX2NvbGksIA0KICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX2Vjb2xpX3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoY29kaWdvLCBlc2NoZXJpY2hpYV9jb2xpLCBhbm9fY29sZXRhKSAlPiUgDQogICAgZmlsdGVyKGFub19jb2xldGE+IjIwMDAiICYNCiAgICAgICAgICAgICBhbm9fY29sZXRhPD0iMjAxMCIpICU+JSANCiAgICBncm91cF9ieShjb2RpZ28pICU+JSANCiAgICBzdW1tYXJpemUoDQogICAgICBtaW4gPSANCiAgICAgICAgbWluKGVzY2hlcmljaGlhX2NvbGksIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKGVzY2hlcmljaGlhX2NvbGksIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihlc2NoZXJpY2hpYV9jb2xpLCANCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWFuID0gDQogICAgICAgIG1lYW4oZXNjaGVyaWNoaWFfY29saSwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUoZXNjaGVyaWNoaWFfY29saSwgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KGVzY2hlcmljaGlhX2NvbGksIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9lY29saV9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgZXNjaGVyaWNoaWFfY29saSwgYW5vX2NvbGV0YSkgJT4lIA0KICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDEwIiAmDQogICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMjAiKSAlPiUgDQogICAgZ3JvdXBfYnkoY29kaWdvKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihlc2NoZXJpY2hpYV9jb2xpLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShlc2NoZXJpY2hpYV9jb2xpLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oZXNjaGVyaWNoaWFfY29saSwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKGVzY2hlcmljaGlhX2NvbGksIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKGVzY2hlcmljaGlhX2NvbGksIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChlc2NoZXJpY2hpYV9jb2xpLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQopDQpgYGANCg0KYGBge3IgU2FsdmFuZG8gZWNvbGksIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSx9DQpnZ3NhdmUoImVjb2xpLnBuZyIsDQogICAgICAgcGxvdCA9IGVjb2xpLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImVjb2xpX3AxLnBuZyIsDQogICAgICAgcGxvdCA9IGVjb2xpX3AxLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImVjb2xpX3AyLnBuZyIsDQogICAgICAgcGxvdCA9IGVjb2xpX3AyLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImVjb2xpX3AzLnBuZyIsDQogICAgICAgcGxvdCA9IGVjb2xpX3AzLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KYGBgDQoNCiMjIyBOaXRyb2fDqm5pbyBhbW9uaWFjYWwNCg0KYGBge3IgR3LDoWZpY28gTml0cm9nw6puaW8gdG90YWwgZmFjZXR0ZWQsIGZpZy5jYXA9Im5pdHJvZ2VuaW8tZ3JhdmF0YcOtIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKG5hbW9uIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogIGJveHBsb3RfbmFtb24oDQogICAgZWl4b195ID0gbml0cm9nZW5pb19hbW9uaWFjYWwsDQogICAgdGl0dWxvID0gIk5pdHJvZ8OqbmlvIEFtb2FuaWFjYWwgbm8gcGVyw61vZG8gMTk5MC0yMDIwIg0KICAgICkrDQogIGZhY2V0X3dyYXAofnBlcmlvZG8pDQogKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIE5pdHJvZ8OqbmlvIGxpbmUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KcGVyaW9kb19pbmljaWFsIDwtIGFzLkRhdGUoIjE5OTAtMDEtMDEiLCAiJVktJW0tJWQiKQ0KcGVyaW9kb19maW5hbCA8LSBhcy5EYXRlKCIyMDIxLTAxLTAxIiwgICIlWS0lbS0lZCIpDQoNCihuaXRyb19saW5lIDwtIA0KICBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogIGZpbHRlcihhbm9fY29sZXRhID4gIjE5OTAiICYNCiAgICAgICAgICAgYW5vX2NvbGV0YSA8PSAiMjAyMCIpICU+JQ0KICBkcGx5cjo6c2VsZWN0KGNvZGlnbywgbml0cm9nZW5pb19hbW9uaWFjYWwsIGRhdGFfY29sZXRhLCBwZXJpb2RvKSAlPiUNCiAgIyBncm91cF9ieShjb2RpZ28pICU+JQ0KICBtdXRhdGUoDQogICAgcG9udG9fbW9uaXRvcmFtZW50byA9IGNhc2Vfd2hlbigNCiAgICAgIGNvZGlnbyA9PSAiODczOTg1MDAiIH4gIlBNMSIsDQogICAgICBjb2RpZ28gPT0gIjg3Mzk4OTgwIiB+ICJQTTIiLA0KICAgICAgY29kaWdvID09ICI4NzM5ODkwMCIgfiAiUE0zIiwNCiAgICAgIGNvZGlnbyA9PSAiODczOTg5NTAiIH4gIlBNNCIsDQogICAgICBjb2RpZ28gPT0gIjg3NDA1NTAwIiB+ICJQTTUiLA0KICAgICAgY29kaWdvID09ICI4NzQwNjkwMCIgfiAiUE02IiwNCiAgICAgIGNvZGlnbyA9PSAiODc0MDk5MDAiIH4gIlBNNyINCiAgICApDQogICkgJT4lIA0KICAgICMgcGl2b3Rfd2lkZXIoDQogICAgIyAgIG5hbWVzX2Zyb20gPSBjb2RpZ28sDQogICAgIyAgIHZhbHVlc19mcm9tID0gbml0cm9fYW1vbiwNCiAgICAjICAgaWRfY29scyA9IGRhdGFfY29sZXRhDQogICAgIyApICU+JSANCiAgICBnZ3Bsb3QoDQogICAgICBhZXMoeCA9IGRhdGFfY29sZXRhLA0KICAgICAgICAgIHkgPSBuaXRyb2dlbmlvX2Ftb25pYWNhbCwNCiAgICAgICAgICAjIGNvbG9yID0gY29kaWdvDQogICAgICApKSsNCiAgICAjIGdlb21fcmVjdCgNCiAgICAjICAgYWVzKHhtaW4gPSBwZXJpb2RvX2luaWNpYWwsIA0KICAgICMgICAgICAgeG1heCA9IHBlcmlvZG9fZmluYWwsDQogICAgIyAgICAgICB5bWluID0gMTMuMywgDQogICAgIyAgICAgICB5bWF4ID0gSW5mLA0KICAgICMgICAgICAgYWxwaGE9IDAuMDA1LA0KICAgICMgICAgICAgZmlsbD0gIiNhYzUwNzkiKSwNCiAgICAjIHNob3cubGVnZW5kID0gRkFMU0UpKyAjPnBpb3IgY2xhc3NlDQogICAgIyBnZW9tX3JlY3QoDQogICAgIyAgIGFlcyh4bWluID0gcGVyaW9kb19pbmljaWFsLCANCiAgICAjICAgICAgIHhtYXggPSBwZXJpb2RvX2ZpbmFsLA0KICAjICAgICAgIHltaW49IDMuNywNCiAgIyAgICAgICB5bWF4PSAxMy4zLA0KICAjICAgICAgIGFscGhhPSAwLjAwNSwNCiAgIyAgICAgICBmaWxsPSAiI2ZjZjdhYiIpLA0KICAjICAgIHNob3cubGVnZW5kID0gRkFMU0UpKyAjY2xhc3NlIDMNCiAgIyBnZW9tX3JlY3QoDQogICMgICBhZXMoeG1pbiA9IHBlcmlvZG9faW5pY2lhbCwgDQogICMgICAgICAgeG1heCA9IHBlcmlvZG9fZmluYWwsDQogICMgICAgICAgeW1pbj0gMCwNCiAgIyAgICAgICB5bWF4PSAzLjcsDQogICMgICAgICAgYWxwaGE9IDAuMDA1LA0KICAjICAgICAgIGZpbGw9ICJibHVlIg0KICAjICAgICAgICAgIyAiIzhkY2RlYiINCiAgIyAgICAgICAgICksDQogICMgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSkrICNjbGFzc2UgMQ0KICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgIHhtaW49IHBlcmlvZG9faW5pY2lhbCwNCiAgICAgICAgICAgeG1heD0gcGVyaW9kb19maW5hbCwNCiAgICAgICAgICAgeW1pbj0xMy4zLA0KICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgYWxwaGE9IDAuNywNCiAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49IHBlcmlvZG9faW5pY2lhbCwNCiAgICAgICAgICAgICB4bWF4PSBwZXJpb2RvX2ZpbmFsLA0KICAgICAgICAgICAgIHltaW49My43LA0KICAgICAgICAgICAgIHltYXg9MTMuMywNCiAgICAgICAgICAgICBhbHBoYT0gMC43LA0KICAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49IHBlcmlvZG9faW5pY2lhbCwNCiAgICAgICAgICAgICB4bWF4PSBwZXJpb2RvX2ZpbmFsLA0KICAgICAgICAgICAgIHltaW49IC1JbmYsDQogICAgICAgICAgICAgeW1heD0zLjcsDQogICAgICAgICAgICAgYWxwaGE9IDAuNywNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIGdlb21fbGluZSgNCiAgICAgICMgYWVzKGNvbG9yID0gY29kaWdvKSwNCiAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICMgYWVzKGNvbG9yID0gY29kaWdvKSwNCiAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgc2NhbGVfeF9kYXRlKA0KICAgICAgbGltaXRzID0gYXMuRGF0ZShjKA0KICAgICAgICAiMTk5MC0wMS0wMSIsIA0KICAgICAgICAiMjAyMS0wMS0wMSINCiAgICAgICAgIyBOQSAjcG9kZSB1c2FyIE5BIHRhbWLDqW0NCiAgICAgICkpLA0KICAgICAgZXhwYW5kID0gYygwLjAsIDAuMCksDQogICAgICBkYXRlX2JyZWFrcyA9ICIxMCB5ZWFycyIsDQogICAgICBtaW5vcl9icmVha3MgPSAiNSB5ZWFycyIsDQogICAgICBkYXRlX2xhYmVscyA9ICIlWSIsDQogICAgKSsNCiAgICAjIGdlb21fc21vb3RoKA0KICAgICMgICAjIGFlcyhjb2xvciA9IGNvZGlnbyksDQogICAgIyAgIG1ldGhvZCA9ICJsbSIsDQogICAgIyAgICMgZm9ybXVsYSA9IHkgfiBwb2x5KHgsIDIpLA0KICAgICMgICAjIHNwYW4gPSAwLjIsDQogICAgIyAgIHNlID0gVFJVRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAjICAgYWVzKGdyb3VwID0gMSksDQogICAgIyAgIGFscGhhID0uNSwNCiAgICAjICAgbmEucm0gPSBUUlVFLA0KICAgICMgICBzaXplID0gMC4zLA0KICAgICMgICAjIGZ1bGxyYW5nZSA9IFRSVUUsDQogICMgICAjIHNob3cubGVnZW5kID0gVFJVRQ0KICAjICkrDQogICMgc3RhdF9zbW9vdGgoDQogICMgICBnZW9tID0gInNtb290aCIsDQogICMgICAjIHNwYW4gPSAwLjIsDQogICMgICBzZSA9IEZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAjICAgIyBhZXMoZ3JvdXAgPSAxKSwNCiAgIyAgICMgYWxwaGEgPS41LA0KICAjICAgbmEucm0gPSBUUlVFLA0KICAjICAgIyBzaXplID0gMC4zLA0KICAjICAgZnVsbHJhbmdlID0gVFJVRSwNCiAgIyAgIHNob3cubGVnZW5kID0gVFJVRQ0KICAjICkrDQogIGZhY2V0X3dyYXAoDQogICAgfnBvbnRvX21vbml0b3JhbWVudG8sDQogICAgbnJvdyA9IDQsDQogICkrDQogICAgdGhlbWVfYncoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIE5pdHJvZ8OqbmlvIHRvdGFsIHBlcmlvZG8xLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihuYW1vbl9wMSA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMTk5MCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDAwIiksDQogICAgICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICAgICBuaXRyb2dlbmlvX2Ftb25pYWNhbCkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTEzLjMsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49My43LA0KICAgICAgICAgICAgIHltYXg9MTMuMywNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICAgeW1heD0zLjcsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJOaXRyb2fDqm5pbyBhbW9uaWFjYWwgbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0ibWcvTCIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA5LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRuaXRyb2dlbmlvX2Ftb25pYWNhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkbml0cm9nZW5pb19hbW9uaWFjYWwsIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAuMDAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBOaXRyb2fDqm5pbyB0b3RhbCBwZXJpb2RvMiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoobmFtb25fcDIgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGE+IjIwMDAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm9fY29sZXRhPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICAgICAgbml0cm9nZW5pb19hbW9uaWFjYWwpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xMy4zLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49My43LA0KICAgICAgICAgICAgeW1heD0xMy4zLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgIHltYXg9My43LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAiTml0cm9nw6puaW8gYW1vbmlhY2FsIG5vIHBlcsOtb2RvIDIwMDAtMjAxMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9Im1nL0wiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wNSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkbml0cm9nZW5pb19hbW9uaWFjYWwsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJG5pdHJvZ2VuaW9fYW1vbmlhY2FsLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIsDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gLjAwMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gTml0cm9nw6puaW8gdG90YWwgcGVyaW9kbzMsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKG5hbW9uX3AzIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAxMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgICAgYWVzKGNvZGlnbywNCiAgICAgICAgICAgICAgICAgICAgICAgIG5pdHJvZ2VuaW9fYW1vbmlhY2FsKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MTMuMywNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTMuNywNCiAgICAgICAgICAgIHltYXg9MTMuMywNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTMuNywNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIk5pdHJvZ8OqbmlvIGFtb25pYWNhbCBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJtZy9MIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDksDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGxhbl93aWRlXzE5OTAyMDIwJG5pdHJvZ2VuaW9fYW1vbmlhY2FsLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRuaXRyb2dlbmlvX2Ftb25pYWNhbCwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IC4wMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIE5hbW9uIDMgcGVyaW9kb3MganVudG9zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ3JpZC5hcnJhbmdlKG5hbW9uX3AxLCBuYW1vbl9wMiwgbmFtb25fcDMsIG5jb2wgPSAzKQ0KYGBgDQoNCmBgYHtyIFN1bcOhcmlvIE5pdHJvZ8OqbmlvIHRvdGFsLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KKHN1bV9uYW1vbl9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICBzZWxlY3QoY29kaWdvLCBuaXRyb2dlbmlvX2Ftb25pYWNhbCwgYW5vX2NvbGV0YSkgJT4lIA0KICAgZmlsdGVyKGFub19jb2xldGE+IjE5OTAiICYNCiAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoY29kaWdvKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihuaXRyb2dlbmlvX2Ftb25pYWNhbCwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUobml0cm9nZW5pb19hbW9uaWFjYWwsIDAuMjUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbihuaXRyb2dlbmlvX2Ftb25pYWNhbCwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKG5pdHJvZ2VuaW9fYW1vbmlhY2FsLCANCiAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZShuaXRyb2dlbmlvX2Ftb25pYWNhbCwgMC43NSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KG5pdHJvZ2VuaW9fYW1vbmlhY2FsLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG4gPSANCiAgICAgICBsZW5ndGgobml0cm9nZW5pb19hbW9uaWFjYWwpDQogICApDQopDQoNCihzdW1fbmFtb25fcDIgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChjb2RpZ28sIG5pdHJvZ2VuaW9fYW1vbmlhY2FsLCBhbm9fY29sZXRhKSAlPiUgDQogICAgZmlsdGVyKGFub19jb2xldGE+IjIwMDAiICYNCiAgICAgICAgICAgICBhbm9fY29sZXRhPD0iMjAxMCIpICU+JSANCiAgICBncm91cF9ieShjb2RpZ28pICU+JSANCiAgICBzdW1tYXJpemUoDQogICAgICBtaW4gPSANCiAgICAgICAgbWluKG5pdHJvZ2VuaW9fYW1vbmlhY2FsLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShuaXRyb2dlbmlvX2Ftb25pYWNhbCwgMC4yNSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKG5pdHJvZ2VuaW9fYW1vbmlhY2FsLCANCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWFuID0gDQogICAgICAgIG1lYW4obml0cm9nZW5pb19hbW9uaWFjYWwsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKG5pdHJvZ2VuaW9fYW1vbmlhY2FsLCAwLjc1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgobml0cm9nZW5pb19hbW9uaWFjYWwsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9uYW1vbl9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgbml0cm9nZW5pb19hbW9uaWFjYWwsIGFub19jb2xldGEpICU+JSANCiAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAxMCIgJg0KICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4obml0cm9nZW5pb19hbW9uaWFjYWwsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKG5pdHJvZ2VuaW9fYW1vbmlhY2FsLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4obml0cm9nZW5pb19hbW9uaWFjYWwsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihuaXRyb2dlbmlvX2Ftb25pYWNhbCwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUobml0cm9nZW5pb19hbW9uaWFjYWwsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChuaXRyb2dlbmlvX2Ftb25pYWNhbCwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIG5hbW9uLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KZ2dzYXZlKCJuYW1vbi5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gbmFtb24sDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgibmFtb25fcDEucG5nIiwNCiAgICAgICBwbG90ID0gbmFtb25fcDEsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgibmFtb25fcDIucG5nIiwNCiAgICAgICBwbG90ID0gbmFtb25fcDIsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgibmFtb25fcDMucG5nIiwNCiAgICAgICBwbG90ID0gbmFtb25fcDMsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgibmFtb25fM3BlcmlvZG9zLnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSBncmlkLmFycmFuZ2UobmFtb25fcDEsIG5hbW9uX3AyLCBuYW1vbl9wMywgbmNvbCA9IDMpLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KYGBgDQoNCiMjIyBUdXJiaWRleg0KDQpgYGB7ciBHcsOhZmljbyBUdXJiaWRleiBmYWNldHRlZCwgZmlnLmNhcD0idHVyYmlkZXotZ3JhdmF0YcOtIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHR1cmIgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCwNCiAgICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICAgICB0dXJiaWRleikpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTEwMCwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTQwLA0KICAgICAgICAgICAgeW1heD0xMDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgeW1heD00MCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9zdW1tYXJ5KA0KICAgICBmdW4uZGF0YSA9IGYsDQogICAgIGdlb20gPSAnZXJyb3JiYXInLA0KICAgICB3aWR0aCA9IDAuMywNCiAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgKSsNCiAgIHN0YXRfc3VtbWFyeSgNCiAgICAgZnVuLmRhdGEgPSBmLA0KICAgICBnZW9tID0gImJveHBsb3QiLA0KICAgICB3aWR0aCA9IDAuNywNCiAgICAgZmlsbCA9ICcjRjhGOEZGJywNCiAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICkrDQogICBmYWNldF93cmFwKH5wZXJpb2RvKSsNCiAgIGxhYnModGl0bGUgPSAiVHVyYmlkZXogbm8gcGVyw61vZG8gMTk5MC0yMDIwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iVU5UIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDUsIDAuMDUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygNCiAgICAgICAgICAgICAgICAgICAgICAgICMgMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkdHVyYmlkZXosIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAjIDUwMA0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCR0dXJiaWRleiwgbmEucm0gPSBUUlVFKQ0KICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIFR1cmJpZGV6IGxpbmUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHR1cmJfbGluZSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogIGZpbHRlcihhbm9fY29sZXRhID4gIjE5OTAiICYNCiAgICAgICAgICAgYW5vX2NvbGV0YSA8PSAiMjAyMCIpICU+JQ0KICBzZWxlY3QoY29kaWdvLCB0dXJiaWRleiwgZGF0YV9jb2xldGEsIHBlcmlvZG8pICU+JQ0KICBncm91cF9ieShjb2RpZ28pICU+JQ0KICBnZ3Bsb3QoDQogICAgYWVzKHggPSBkYXRhX2NvbGV0YSwNCiAgICAgICAgeSA9IHR1cmJpZGV6LA0KICAgICAgICBjb2xvciA9IGNvZGlnbw0KICAgICkpKw0KICAgIGdlb21fbGluZSgNCiAgICAgICMgYWVzKGNvbG9yID0gY29kaWdvKSwNCiAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgZ2VvbV9wb2ludCgNCiAgICAgICMgYWVzKGNvbG9yID0gY29kaWdvKSwNCiAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgc2NhbGVfeF9kYXRlKA0KICAgICAgbGltaXRzID0gYXMuRGF0ZShjKA0KICAgICAgICAiMTk5MC0wMS0wMSIsIA0KICAgICAgICAiMjAyMS0wMS0wMSINCiAgICAgICAgIyBOQSAjcG9kZSB1c2FyIE5BIHRhbWLDqW0NCiAgICAgICkpLA0KICAgICAgZXhwYW5kID0gYygwLjAsIDAuMCksDQogICAgICBkYXRlX2JyZWFrcyA9ICIxMCB5ZWFycyIsDQogICAgICBtaW5vcl9icmVha3MgPSAiNSB5ZWFycyIsDQogICAgICBkYXRlX2xhYmVscyA9ICIlWSIsDQogICAgKSsNCiAgIyBnZW9tX3Ntb290aCgNCiAgIyAgICMgYWVzKGNvbG9yID0gY29kaWdvKSwNCiAgIyAgIG1ldGhvZCA9ICJsbSIsDQogICMgICAjIGZvcm11bGEgPSB5IH4gcG9seSh4LCAyKSwNCiAgIyAgICMgc3BhbiA9IDAuMiwNCiAgIyAgIHNlID0gVFJVRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgIyAgIGFlcyhncm91cCA9IDEpLA0KICAjICAgYWxwaGEgPS41LA0KICAjICAgbmEucm0gPSBUUlVFLA0KICAjICAgc2l6ZSA9IDAuMywNCiAgIyAgICMgZnVsbHJhbmdlID0gVFJVRSwNCiAgIyAgICMgc2hvdy5sZWdlbmQgPSBUUlVFDQogICMgKSsNCiAgIyBzdGF0X3Ntb290aCgNCiAgIyAgIGdlb20gPSAic21vb3RoIiwNCiAgIyAgICMgc3BhbiA9IDAuMiwNCiAgIyAgIHNlID0gRkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICMgICAjIGFlcyhncm91cCA9IDEpLA0KICAjICAgIyBhbHBoYSA9LjUsDQogICMgICBuYS5ybSA9IFRSVUUsDQogICMgICAjIHNpemUgPSAwLjMsDQogICMgICBmdWxscmFuZ2UgPSBUUlVFLA0KICAjICAgc2hvdy5sZWdlbmQgPSBUUlVFDQogICMgKSsNCiAgZmFjZXRfd3JhcCgNCiAgICB+Y29kaWdvLA0KICAgIG5yb3cgPSA0LA0KICApKw0KICB0aGVtZV9idygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gVHVyYmlkZXogcGVyaW9kbzEsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHR1cmJfcDEgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMTk5MCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMDAiKSwNCiAgICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICAgICB0dXJiaWRleikpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTEwMCwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTQwLA0KICAgICAgICAgICAgeW1heD0xMDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgeW1heD00MCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIlR1cmJpZGV6IG5vIHBlcsOtb2RvIDE5OTAtMjAwMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IlVOVCIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjA1LCAwLjAzKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCR0dXJiaWRleiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkdHVyYmlkZXosIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBUdXJiaWRleiBwZXJpb2RvMiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoodHVyYl9wMiA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm9fY29sZXRhPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICAgIHR1cmJpZGV6KSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MTAwLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NDAsDQogICAgICAgICAgICB5bWF4PTEwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTQwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAiVHVyYmlkZXogbm8gcGVyw61vZG8gMjAwMC0yMDEwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iVU5UIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDUsIDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGxhbl93aWRlXzE5OTAyMDIwJHR1cmJpZGV6LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCR0dXJiaWRleiwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIFR1cmJpZGV6IHBlcmlvZG8zLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCih0dXJiX3AzIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDIwIiksDQogICAgICAgICAgICAgICAgICAgYWVzKGNvZGlnbywNCiAgICAgICAgICAgICAgICAgICAgICAgdHVyYmlkZXopKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xMDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj00MCwNCiAgICAgICAgICAgIHltYXg9MTAwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgIHltYXg9NDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJUdXJiaWRleiBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJVTlQiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wNSwgMC4wMykpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkdHVyYmlkZXosIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJHR1cmJpZGV6LCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIsDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gdHVyYiAzIHBlcmlvZG9zIGp1bnRvcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmdyaWQuYXJyYW5nZSh0dXJiX3AxLCB0dXJiX3AyLCB0dXJiX3AzLCBuY29sID0gMykNCmBgYA0KDQpgYGB7ciBTdW3DoXJpbyBUdXJiaWRleiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCihzdW1fdHVyYl9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICBzZWxlY3QoY29kaWdvLCB0dXJiaWRleiwgYW5vX2NvbGV0YSkgJT4lIA0KICAgZmlsdGVyKGFub19jb2xldGE+IjE5OTAiICYNCiAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoY29kaWdvKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbih0dXJiaWRleiwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUodHVyYmlkZXosIDAuMjUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbih0dXJiaWRleiwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKHR1cmJpZGV6LCANCiAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZSh0dXJiaWRleiwgMC43NSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KHR1cmJpZGV6LCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV90dXJiX3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoY29kaWdvLCB0dXJiaWRleiwgYW5vX2NvbGV0YSkgJT4lIA0KICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDAwIiAmDQogICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMTAiKSAlPiUgDQogICAgZ3JvdXBfYnkoY29kaWdvKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbih0dXJiaWRleiwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUodHVyYmlkZXosIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbih0dXJiaWRleiwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKHR1cmJpZGV6LCANCiAgICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZSh0dXJiaWRleiwgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KHR1cmJpZGV6LCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQopDQoNCihzdW1fdHVyYl9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgdHVyYmlkZXosIGFub19jb2xldGEpICU+JSANCiAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAxMCIgJg0KICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4odHVyYmlkZXosIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKHR1cmJpZGV6LCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4odHVyYmlkZXosIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbih0dXJiaWRleiwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUodHVyYmlkZXosIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heCh0dXJiaWRleiwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKSANCmBgYA0KDQpgYGB7ciBTYWx2YW5kbyB0dXJiLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KZ2dzYXZlKCJ0dXJiLnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSB0dXJiLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoInR1cmJfcDEucG5nIiwNCiAgICAgICBwbG90ID0gdHVyYl9wMSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJ0dXJiX3AyLnBuZyIsDQogICAgICAgcGxvdCA9IHR1cmJfcDIsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgidHVyYl9wMy5wbmciLA0KICAgICAgIHBsb3QgPSB0dXJiX3AzLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoInR1cmJfM3BlcmlvZG9zLnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSBncmlkLmFycmFuZ2UodHVyYl9wMSwgdHVyYl9wMiwgdHVyYl9wMywgbmNvbCA9IDMpLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KYGBgDQoNCiMjIyBwSA0KDQpgYGB7ciBHcsOhZmljbyBwSCBmYWNldHRlZCwgZmlnLmNhcD0icEgtZ3JhdmF0YcOtIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHBIIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAsDQogICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICBwSCkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj05LA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj02LA0KICAgICAgICAgICAgeW1heD05LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X3N1bW1hcnkoDQogICAgIGZ1bi5kYXRhID0gZiwNCiAgICAgZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgIHdpZHRoID0gMC4zLA0KICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICApKw0KICAgc3RhdF9zdW1tYXJ5KA0KICAgICBmdW4uZGF0YSA9IGYsDQogICAgIGdlb20gPSAiYm94cGxvdCIsDQogICAgIHdpZHRoID0gMC43LA0KICAgICBmaWxsID0gJyNGOEY4RkYnLA0KICAgICBjb2xvciA9ICJibGFjayIsDQogICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgKSsNCiAgIGZhY2V0X3dyYXAofnBlcmlvZG8pKw0KICAgbGFicyh0aXRsZSA9ICJwSCBubyBwZXLDrW9kbyAxOTkwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wMSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDQsMTEpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIHBIIHBlcmlvZG8xLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihwSF9wMSA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMTk5MCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDAwIiksDQogICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICBwSCkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj05LA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj02LA0KICAgICAgICAgICAgeW1heD05LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAicEggbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDEpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyg0LDExKSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBwSCBwZXJpb2RvMiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoocEhfcDIgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGE+IjIwMDAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm9fY29sZXRhPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICAgcEgpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD02LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49OSwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NiwNCiAgICAgICAgICAgIHltYXg9OSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gInBIIG5vIHBlcsOtb2RvIDIwMDAtMjAxMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IiIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjAxKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoNCwxMSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gcEggcGVyaW9kbzMsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHBIX3AzIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgYWVzKGNvZGlnbywNCiAgICAgICAgICAgICAgICAgICAgIHBIKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9NiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTksDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTYsDQogICAgICAgICAgICB5bWF4PTksDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJwSCBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wMSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDQsMTEpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIHBIIDMgcGVyaW9kb3MganVudG9zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ3JpZC5hcnJhbmdlKHBIX3AxLCBwSF9wMiwgcEhfcDMsIG5jb2wgPSAzKQ0KYGBgDQoNCmBgYHtyIFN1bcOhcmlvIHBILCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KKHN1bV9wSF9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICBzZWxlY3QoY29kaWdvLCBwSCwgYW5vX2NvbGV0YSkgJT4lIA0KICAgZmlsdGVyKGFub19jb2xldGE+IjE5OTAiICYNCiAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoY29kaWdvKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihwSCwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUocEgsIDAuMjUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbihwSCwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKHBILCANCiAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZShwSCwgMC43NSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KHBILCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9wSF9wMiA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgcEgsIGFub19jb2xldGEpICU+JSANCiAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAwMCIgJg0KICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4ocEgsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKHBILCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4ocEgsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihwSCwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUocEgsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChwSCwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKSANCg0KKHN1bV9wSF9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgcEgsIGFub19jb2xldGEpICU+JSANCiAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAxMCIgJg0KICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4ocEgsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKHBILCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4ocEgsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihwSCwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUocEgsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChwSCwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIHBILCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KZ2dzYXZlKCJwSC5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gcEgsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgicEhfcDEucG5nIiwNCiAgICAgICBwbG90ID0gcEhfcDEsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgicEhfcDIucG5nIiwNCiAgICAgICBwbG90ID0gcEhfcDIsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgicEhfcDMucG5nIiwNCiAgICAgICBwbG90ID0gcEhfcDMsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgicEhfM3BlcmlvZG9zLnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSBncmlkLmFycmFuZ2UocEhfcDEsIHBIX3AyLCBwSF9wMywgbmNvbCA9IDMpLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KYGBgDQoNCiMjIyBTw7NsaWRvcyB0b3RhaXMNCg0KYGBge3IgR3LDoWZpY28gU8OzbFRvdCBmYWNldHRlZCwgZmlnLmNhcD0ic8OzbGlkb3MtdG90YWlzLWdyYXZhdGHDrSBubyBwZXLDrW9kbyAxOTkwLTIwMjAiLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihTb2xUb3QgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCwNCiAgICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICAgc29saWRvc190b3RhaXMpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLA0KICAgICAgICAgICAgeW1pbiA9IDUwMCwgeW1heCA9IEluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD01MDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfc3VtbWFyeSgNCiAgICAgZnVuLmRhdGEgPSBmLA0KICAgICBnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgd2lkdGggPSAwLjMsDQogICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICkrDQogICBzdGF0X3N1bW1hcnkoDQogICAgIGZ1bi5kYXRhID0gZiwNCiAgICAgZ2VvbSA9ICJib3hwbG90IiwNCiAgICAgd2lkdGggPSAwLjcsDQogICAgIGZpbGwgPSAnI0Y4RjhGRicsDQogICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICApKw0KICAgZmFjZXRfd3JhcCh+cGVyaW9kbykrDQogICBsYWJzKHRpdGxlID0gIlPDs2xpZG9zIHRvdGFpcyBubyBwZXLDrW9kbyAxOTkwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wNSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJHNvbGlkb3NfdG90YWlzLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICAgKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIFPDs2xUb3QgcGVyaW9kbzEsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKFNvbFRvdF9wMSA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGE+IjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMDAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICAgICAgc29saWRvc190b3RhaXMpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLA0KICAgICAgICAgICAgeW1pbiA9IDUwMCwgeW1heCA9IEluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD01MDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJTw7NsaWRvcyB0b3RhaXMgbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRzb2xpZG9zX3RvdGFpcywgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gU8OzbFRvdCBwZXJpb2RvMiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooU29sVG90X3AyIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm9fY29sZXRhPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgICAgICAgYWVzKGNvZGlnbywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzb2xpZG9zX3RvdGFpcykpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsDQogICAgICAgICAgICB5bWluID0gNTAwLCB5bWF4ID0gSW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTUwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIlPDs2xpZG9zIHRvdGFpcyBubyBwZXLDrW9kbyAyMDAwLTIwMTAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wNSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJHNvbGlkb3NfdG90YWlzLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgICBzaXplID0gMS4yLA0KICAgICAgIGFscGhhID0gLjI1LA0KICAgICAgIHdpZHRoID0gLjA3LA0KICAgICkrDQogICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICApKw0KICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgICBzaXplID0gMSkrDQogICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIFPDs2xUb3QgcGVyaW9kbzMsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKFNvbFRvdF9wMyA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICAgICAgc29saWRvc190b3RhaXMpKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluID0gLUluZiwgeG1heCA9IEluZiwNCiAgICAgICAgICAgIHltaW4gPSA1MDAsIHltYXggPSBJbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICAgeW1heD01MDAsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgIGxhYnModGl0bGUgPSAiU8OzbGlkb3MgdG90YWlzIG5vIHBlcsOtb2RvIDIwMTAtMjAyMCIsDQogICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICAgeT0iIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRzb2xpZG9zX3RvdGFpcywgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBTw7NsVG90IDMgcGVyaW9kb3MganVudG9zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ3JpZC5hcnJhbmdlKFNvbFRvdF9wMSwgU29sVG90X3AyLCBTb2xUb3RfcDMsIG5jb2wgPSAzKQ0KYGBgDQoNCmBgYHtyIFN1bcOhcmlvIFPDs2xpZG9zIFRvdGFpcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCihzdW1fU29sVG90X3AxIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgIHNlbGVjdChjb2RpZ28sIHNvbGlkb3NfdG90YWlzLCBhbm9fY29sZXRhKSAlPiUgDQogICBmaWx0ZXIoYW5vX2NvbGV0YT4iMTk5MCIgJg0KICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMDAiKSAlPiUgDQogICBncm91cF9ieShjb2RpZ28pICU+JSANCiAgIHN1bW1hcml6ZSgNCiAgICAgbWluID0gDQogICAgICAgbWluKHNvbGlkb3NfdG90YWlzLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgcTEgPSANCiAgICAgICBxdWFudGlsZShzb2xpZG9zX3RvdGFpcywgMC4yNSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWVkaWFuID0gDQogICAgICAgbWVkaWFuKHNvbGlkb3NfdG90YWlzLCANCiAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWVhbiA9IA0KICAgICAgIG1lYW4oc29saWRvc190b3RhaXMsIA0KICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICBxMyA9IA0KICAgICAgIHF1YW50aWxlKHNvbGlkb3NfdG90YWlzLCAwLjc1LCANCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtYXggPSANCiAgICAgICBtYXgoc29saWRvc190b3RhaXMsIA0KICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX1NvbFRvdF9wMiA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgc29saWRvc190b3RhaXMsIGFub19jb2xldGEpICU+JSANCiAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAwMCIgJg0KICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oc29saWRvc190b3RhaXMsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKHNvbGlkb3NfdG90YWlzLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oc29saWRvc190b3RhaXMsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihzb2xpZG9zX3RvdGFpcywgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUoc29saWRvc190b3RhaXMsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChzb2xpZG9zX3RvdGFpcywgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX1NvbFRvdF9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgc29saWRvc190b3RhaXMsIGFub19jb2xldGEpICU+JSANCiAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAxMCIgJg0KICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oc29saWRvc190b3RhaXMsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKHNvbGlkb3NfdG90YWlzLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oc29saWRvc190b3RhaXMsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihzb2xpZG9zX3RvdGFpcywgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUoc29saWRvc190b3RhaXMsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChzb2xpZG9zX3RvdGFpcywgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIFNvbFRvdCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCmdnc2F2ZSgiU29sVG90LnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSBTb2xUb3QsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiU29sVG90X3AxLnBuZyIsDQogICAgICAgcGxvdCA9IFNvbFRvdF9wMSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJTb2xUb3RfcDIucG5nIiwNCiAgICAgICBwbG90ID0gU29sVG90X3AyLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoIlNvbFRvdF9wMy5wbmciLA0KICAgICAgIHBsb3QgPSBTb2xUb3RfcDMsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiU29sVG90XzNwZXJpb2Rvcy5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gZ3JpZC5hcnJhbmdlKFNvbFRvdF9wMSwgU29sVG90X3AyLCBTb2xUb3RfcDMsIG5jb2wgPSAzKSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCmBgYA0KDQojIyMgSVFBDQoNCmBgYHtyIEdyw6FmaWNvIElRQSBmYWNldHRlZCwgZmlnLmNhcD0iaXFhLWdyYXZhdGHDrSBubyBwZXLDrW9kbyAxOTkwLTIwMjAiLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQooaXFhIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCwNCiAgICAgICAgICAgICAgYWVzKGNvZGlnbywNCiAgICAgICAgICAgICAgICAgIGlxYSwgbmEucm0gPSBUUlVFKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9MjUsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MjUsDQogICAgICAgICAgICB5bWF4PTUwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTAsDQogICAgICAgICAgICB5bWF4PTcwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NzAsDQogICAgICAgICAgICB5bWF4PTkwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49OTAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9zdW1tYXJ5KA0KICAgICBmdW4uZGF0YSA9IGYsDQogICAgIGdlb20gPSAnZXJyb3JiYXInLA0KICAgICB3aWR0aCA9IDAuMywNCiAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgKSsNCiAgIHN0YXRfc3VtbWFyeSgNCiAgICAgZnVuLmRhdGEgPSBmLA0KICAgICBnZW9tID0gImJveHBsb3QiLA0KICAgICB3aWR0aCA9IDAuNywNCiAgICAgZmlsbCA9ICcjRjhGOEZGJywNCiAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICkrDQogICBmYWNldF93cmFwKH5wZXJpb2RvKSsNCiAgIGxhYnModGl0bGUgPSAiVmFyaWHDp8OjbyBkbyBJUUEgbm8gcGVyw61vZG8gMTk5MC0yMDIwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iSVFBIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCiAgICMgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIElRQSBwZXJpb2RvMSwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KKGlxYV9wMSA8LWdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgIGZpbHRlcihhbm9fY29sZXRhID4gIjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm9fY29sZXRhIDw9ICIyMDAwIiksDQogICAgICAgICAgICAgICAgIGFlcyhjb2RpZ28sDQogICAgICAgICAgICAgICAgICAgICBpcWEsIG5hLnJtID0gVFJVRSkpKw0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD0yNSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0yNSwNCiAgICAgICAgICAgIHltYXg9NTAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MCwNCiAgICAgICAgICAgIHltYXg9NzAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj03MCwNCiAgICAgICAgICAgIHltYXg9OTAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj05MCwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgICB3aWR0aD0gMC43LA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgIGxhYnModGl0bGUgPSAiVmFyaWHDp8OjbyBkbyBJUUEgbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgICB5PSIiKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDYsDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMTAxKSkrDQogICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkrDQogICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gSVFBIHBlcmlvZG8yLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQooaXFhX3AyIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGEgPiAiMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGEgPD0gIjIwMTAiKSwNCiAgICAgICAgICAgICAgICAgYWVzKGNvZGlnbywNCiAgICAgICAgICAgICAgICAgICAgIGlxYSwgbmEucm0gPSBUUlVFKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9MjUsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MjUsDQogICAgICAgICAgICB5bWF4PTUwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTAsDQogICAgICAgICAgICB5bWF4PTcwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NzAsDQogICAgICAgICAgICB5bWF4PTkwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49OTAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgIGxhYnModGl0bGUgPSAiVmFyaWHDp8OjbyBkbyBJUUEgbm8gcGVyw61vZG8gMjAwMC0yMDEwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiB0aGVtZV9ncmFmcygpKw0KICAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpDQogICApDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gSVFBIHBlcmlvZG8zLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQooaXFhX3AzIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKGFub19jb2xldGEgPiAiMjAxMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGEgPD0gIjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgYWVzKGNvZGlnbywNCiAgICAgICAgICAgICAgICAgICAgIGlxYSwgbmEucm0gPSBUUlVFKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9MjUsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MjUsDQogICAgICAgICAgICB5bWF4PTUwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTAsDQogICAgICAgICAgICB5bWF4PTcwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NzAsDQogICAgICAgICAgICB5bWF4PTkwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49OTAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgIGxhYnModGl0bGUgPSAiVmFyaWHDp8OjbyBkbyBJUUEgbm8gcGVyw61vZG8gMjAxMC0yMDIwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iIikrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgICB0aGVtZV9ncmFmcygpKw0KICAgIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBJUUEgMyBwZXJpb2RvcyBqdW50b3MsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpncmlkLmFycmFuZ2UoaXFhX3AxLCBpcWFfcDIsIGlxYV9wMywgbmNvbCA9IDMpDQpgYGANCg0KYGBge3IgU3Vtw6FyaW8gSVFBLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KKHN1bV9JUUFfcDEgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgc2VsZWN0KGNvZGlnbywgaXFhLCBhbm9fY29sZXRhKSAlPiUgDQogICBmaWx0ZXIoYW5vX2NvbGV0YT4iMTk5MCIgJg0KICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMDAiKSAlPiUgDQogICBncm91cF9ieShjb2RpZ28pICU+JSANCiAgIHN1bW1hcml6ZSgNCiAgICAgbWluID0gDQogICAgICAgbWluKGlxYSwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUoaXFhLCAwLjI1LCANCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWRpYW4gPSANCiAgICAgICBtZWRpYW4oaXFhLCANCiAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWVhbiA9IA0KICAgICAgIG1lYW4oaXFhLCANCiAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZShpcWEsIDAuNzUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1heCA9IA0KICAgICAgIG1heChpcWEsIA0KICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBuID0gDQogICAgICAgIGxlbmd0aChpcWEpDQogICApDQopDQoNCihzdW1fSVFBX3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoY29kaWdvLCBpcWEsIGFub19jb2xldGEpICU+JSANCiAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAwMCIgJg0KICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oaXFhLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShpcWEsIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihpcWEsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihpcWEsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKGlxYSwgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KGlxYSwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbiA9IA0KICAgICAgICBsZW5ndGgoaXFhKQ0KICAgICAgKQ0KKQ0KDQooc3VtX0lRQV9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgaXFhLCBhbm9fY29sZXRhKSAlPiUgDQogICAgZmlsdGVyKGFub19jb2xldGE+IjIwMTAiICYNCiAgICAgICAgICAgICBhbm9fY29sZXRhPD0iMjAyMCIpICU+JQ0KICAgICMgP2FzX2ZhY3Rvcihjb2RpZ28pICU+JSANCiAgICBncm91cF9ieShjb2RpZ28pICU+JQ0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oaXFhLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShpcWEsIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihpcWEsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihpcWEsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKGlxYSwgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KGlxYSwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbiA9IA0KICAgICAgICBsZW5ndGgoaXFhKSwNCiAgICAgIE5BcyA9IA0KICAgICAgICBzdW0oaXMubmEoaXFhKSkNCiAgICAgICkgJT4lIA0KICBtdXRhdGUoDQogICAgIiVOQSIgPSBOQXMvbioxMDANCiAgKQ0KKQ0KDQpgYGANCg0KYGBge3IgU2FsdmFuZG8gaXFhLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsfQ0KZ2dzYXZlKCJpcWEucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGlxYSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJpcWFfcDEucG5nIiwNCiAgICAgICBwbG90ID0gaXFhX3AxLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImlxYV9wMi5wbmciLA0KICAgICAgIHBsb3QgPSBpcWFfcDIsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiaXFhX3AzLnBuZyIsDQogICAgICAgcGxvdCA9IGlxYV9wMywNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJpcWFfM3BlcmlvZG9zLnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSBncmlkLmFycmFuZ2UoaXFhX3AxLCBpcWFfcDIsIGlxYV9wMywgbmNvbCA9IDMpLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KYGBgDQoNCiMjIFRlc3RhbmRvIGNvaXNhcw0KDQpgYGB7ciBUZXN0YW5kbyBjb2lzYXMsIGluY2x1ZGUgPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCiMgcGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiMgICAgc2VsZWN0KGNvZGlnbywgb3hpZ2VuaW9fZGlzc29sdmlkbywgYW5vX2NvbGV0YSkgJT4lIA0KIyAgICBnZ3Bsb3QoYWVzKGFub19jb2xldGEsIG94aWdlbmlvX2Rpc3NvbHZpZG8sIA0KIyAgICAgICBjb2wgPSBjb2RpZ28pKSsNCiMgICAgZ2VvbV9saW5lKCkrDQojICAgIGZhY2V0X3dyYXAofiBjb2RpZ28sIG5jb2wgPSA3KQ0KDQojIGRmMTExIDwtIGRhdGEuZnJhbWUoeCA9IGMoMToxMDApKQ0KIyBnbGltcHNlKGRmMTExKQ0KIyBkZjExMSR5IDwtIDIgKyAzICogZGYxMTEkeCArIHJub3JtKDEwMCwgc2QgPSA0MCkNCiMgDQojIGxtX2VxbiA8LSBmdW5jdGlvbihkZjExMSl7DQojICAgICBtIDwtIGxtKHkgfiB4LCBkZjExMSk7DQojICAgICBlcSA8LSBzdWJzdGl0dXRlKHkgPT0gYSArIGIgJS4lIHgqIiwifn5yXjJ+Ij0ifnIyLA0KIyAgICAgICAgICBsaXN0KGEgPSBmb3JtYXQodW5uYW1lKGNvZWYobSlbMV0pLCBkaWdpdHMgPSAyKSwNCiMgICAgICAgICAgICAgICBiID0gZm9ybWF0KHVubmFtZShjb2VmKG0pWzJdKSwgZGlnaXRzID0gMiksDQojICAgICAgICAgICAgICByMiA9IGZvcm1hdChzdW1tYXJ5KG0pJHIuc3F1YXJlZCwgZGlnaXRzID0gMykpKQ0KIyAgICAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsNCiMgfSANCiMgcDIgPC0gcDExMSArDQojICAgZ2VvbV90ZXh0KHggPSAyNSwgeSA9IDMwMCwNCiMgICAgICAgICAgICAgbGFiZWwgPSBsbV9lcW4oZGYxMTEpLA0KIyAgICAgICAgICAgICBwYXJzZSA9IFRSVUUpDQojIHAyDQojIA0KIyANCiMgbG1fZXFjIDwtIGZ1bmN0aW9uKHBsYW5fd2lkZV8xOTkwMjAyMCl7DQojICAgIG0gPC0gbG0ob3hpZ2VuaW9fZGlzc29sdmlkbyB+IGNvZGlnbywgcGxhbl93aWRlXzE5OTAyMDIwKTsNCiMgICAgZXEgPC0gc3Vic3RpdHV0ZSh5ID09IGEgKyBiICUuJSB4KiIsIn5+cl4yfiI9In5yMiwNCiMgICAgICAgICAgICAgICAgICAgICBsaXN0KGEgPSBmb3JtYXQodW5uYW1lKGNvZWYobSlbMV0pLCBkaWdpdHMgPSAyKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBmb3JtYXQodW5uYW1lKGNvZWYobSlbMl0pLCBkaWdpdHMgPSAyKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gZm9ybWF0KHN1bW1hcnkobSkkci5zcXVhcmVkLCBkaWdpdHMgPSAzKSkpDQojICAgIGFzLmNoYXJhY3Rlcihhcy5leHByZXNzaW9uKGVxKSk7DQojIH0NCiMgDQojIChvZF9wMSA8LWdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMTk5MCIgJg0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDAwIiksDQojICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KIyAgICAgICAgICAgICAgICAgICAgIG94aWdlbmlvX2Rpc3NvbHZpZG8pKSsNCiMgICAgICAgYW5ub3RhdGUoInJlY3QiLA0KIyAgICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgICB5bWluPS1JbmYsDQojICAgICAgICAgICAgICAgIHltYXg9MiwNCiMgICAgICAgICAgICAgICAgYWxwaGE9MSwNCiMgICAgICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQojICAgICAgIGFubm90YXRlKCJyZWN0IiwNCiMgICAgICAgICAgICAgICAgeG1pbj0tSW5mLA0KIyAgICAgICAgICAgICAgICB4bWF4PUluZiwNCiMgICAgICAgICAgICAgICAgeW1pbj0yLA0KIyAgICAgICAgICAgICAgICB5bWF4PTQsDQojICAgICAgICAgICAgICAgIGFscGhhPTEsDQojICAgICAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQojICAgICAgIGFubm90YXRlKCJyZWN0IiwNCiMgICAgICAgICAgICAgICAgeG1pbj0tSW5mLA0KIyAgICAgICAgICAgICAgICB4bWF4PUluZiwNCiMgICAgICAgICAgICAgICAgeW1pbj00LA0KIyAgICAgICAgICAgICAgICB5bWF4PTUsDQojICAgICAgICAgICAgICAgIGFscGhhPTEsDQojICAgICAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQojICAgICAgIGFubm90YXRlKCJyZWN0IiwNCiMgICAgICAgICAgICAgICAgeG1pbj0tSW5mLA0KIyAgICAgICAgICAgICAgICB4bWF4PUluZiwNCiMgICAgICAgICAgICAgICAgeW1pbj01LA0KIyAgICAgICAgICAgICAgICB5bWF4PTYsDQojICAgICAgICAgICAgICAgIGFscGhhPTEsDQojICAgICAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQojICAgICAgIGFubm90YXRlKCJyZWN0IiwNCiMgICAgICAgICAgICAgICAgeG1pbj0tSW5mLA0KIyAgICAgICAgICAgICAgICB4bWF4PUluZiwNCiMgICAgICAgICAgICAgICAgeW1pbj02LA0KIyAgICAgICAgICAgICAgICB5bWF4PUluZiwNCiMgICAgICAgICAgICAgICAgYWxwaGE9MSwNCiMgICAgICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiMgICAgICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KIyAgICAgICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KIyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiMgICAgICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KIyAgICAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiMgICAgICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KIyAgICAgICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQojICAgICAgIGxhYnModGl0bGUgPSAiT3hpZ8OqbmlvIERpc3NvbHZpZG8gbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiMgICAgICAgICAgICB4PSJFc3Rhw6fDo28iLA0KIyAgICAgICAgICAgIHk9Im1nL0wiKSsNCiMgICAgICAgIyBnZW9tX2ppdHRlcih3aWR0aCA9IC4wNSwNCiMgICAgICAgIyAgICAgICAgICAgICBhbHBoYT0uMiwNCiMgICAgICAgIyAgICAgICAgICAgICBzaXplPTEuNSwNCiMgICAgICAgIyAgICAgICAgICAgICBjb2xvcj0iYmxhY2siKSsNCiMgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gMTEsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDIxKSkrDQojICAgICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLCAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQojICAgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQojICAgICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KIyAgICAgICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQojICAgICAgICAgICAgICAgICAgIGFscGhhPS41LA0KIyAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQojICAgICAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiMgICAgICAgIyBhbm5vdGF0ZShnZW9tX3RleHQoYWVzKHggPSAiODc0MDU1MDAiLCB5ID0gMTUpLA0KIyAgICAgICAjICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGxtX2VxYyhwbGFuX3dpZGVfMTk5MDIwMjApLA0KIyAgICAgICAjICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IFRSVUUsDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gVFJVRSwNCiMgICAgICAgIyAgICAgICAgICAgICAgICAgICAgY2hlY2tfb3ZlcmxhcCA9IFRSVUUpKSsNCiMgICAgICAgIyAgZ2VvbV9saW5lKA0KIyAgICAgICAjICAgICBhZXMoY29sb3I9InJlZCIpLA0KIyAgICAgICAjICAgICBhbHBoYT0uMCwNCiMgICAgICAgIyApKw0KIyAgICAgICAjIHNjYWxlX2NvbG9yX21hbnVhbCgiTGVnZW5kYSIsDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgIGd1aWRlPSJsZWdlbmQiLA0KIyAgICAgICAjICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJDbGFzc2UgMSI9IiM4ZGNkZWIiLA0KIyAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGFzc2UgMiI9IiM3MGMxOGMiLA0KIyAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGFzc2UgMyI9IiNmY2Y3YWIiLA0KIyAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGFzc2UgNCI9IiNlYjU2NjEiLA0KIyAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaW9yIENsYXNzZSI9IiNhYzUwNzkiKSkrDQojICAgICMgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGxpbmV0eXBlPWMoMSwxLDEsMSwxKSwNCiMgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHdkPWMoMiwyLDIsMiwyKSwNCiMgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGU9YyhOQSxOQSxOQSxOQSxOQSksDQojICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhPTEpKSkrDQojICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiMgICAgICAgdGhlbWVfY2xhc3NpYygpKQ0KDQojIGxpc3QxMTExIDwtIHNlc3Npb25JbmZvKCkNCiMgbGlzdDExMTEkbG9hZGVkT25seQ0KDQojIGluc3RhbGwucGFja2FnZXMoImdncG1pc2MiKQ0KIyBsaWJyYXJ5KGdncG1pc2MpDQoNCiMgc3VtbWFyeShsbShwbGFuX3dpZGVfMTk5MDIwMjAkY29kaWdvfnBsYW5fd2lkZV8xOTkwMjAyMCRkYm8pKQ0KIyANCiMgDQojIHAgPC0gZ2dwbG90KGRhdGEsIGFlcyh5PW51bWJlciwgeD1wb2QpKSArDQojICAgZ2VvbV9ib3hwbG90KCkNCiMgcHJpbnQocCkNCg0KIyBpbnN0YWxsLnBhY2thZ2VzKCJHR2FsbHkiKQ0KDQoNCiMgZml0ID0gbG0ocGxhbl93aWRlXzE5OTAyMDIwJG94aWdlbmlvX2Rpc3NvbHZpZG9+IHBsYW5fd2lkZV8xOTkwMjAyMCRjb2RpZ28pDQojIHN1bW1hcnkoZml0KQ0KIyBzdW1tYXJ5LmxtKGZpdCkNCiMgDQojIHBhY21hbjo6cF9sb2FkKGVzcXVpc3NlKQ0KDQojIHN1bWFyaW8gPC0gZnVuY3Rpb24oeCwgeSl7DQojICAgeCAlPiUgDQojICAgICBncm91cF9ieShjb2RpZ28pICU+JQ0KIyAgICAgc3VtbWFyaXNlKA0KIyAgICAgICBsaXN0KG1pbj0gfm1pbih5LCBuYS5ybSA9IFRSVUUpLCANCiMgICAgICAgICAgICBRMT0gfnF1YW50aWxlKHksIHByb2JzID0gMC4yNSksDQojICAgICAgICAgICAgbWVkaWFuPSB+bWVkaWFuKHksIG5hLnJtID0gVFJVRSksIA0KIyAgICAgICAgICAgIFEzPSB+cXVhbnRpbGUoeSwgcHJvYnMgPSAwLjc1KSwNCiMgICAgICAgICAgICBtYXg9IH5tYXgoeSwgbmEucm0gPSBUUlVFKSksDQojICAgICAgIC5ncm91cHMgPSAiZHJvcCINCiMgICAgICAgKQ0KIyB9DQpgYGANCg0KIyMjIENvcnJlbGHDp8Ojbw0KDQpgYGB7ciBDb3JyZWxhw6fDo28sIGZpZy5jYXA9ImNvcnJlbGHDp8Ojby1wYXJhbWV0cm9zLXF1YWxpZGFkZS1hZ3VhLWdyYXZhdGHDrSBubyBwZXLDrW9kbyAxOTkwLTIwMjAiLCB0aW1lX2l0ID0gVFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLH0NCnBhcmFtZXRyb3NfSVFBICU+JSANCiAgZHBseXI6OnNlbGVjdCgNCiAgICAtY29kaWdvLA0KICAgIC1hbm9fY29sZXRhLA0KICAgIC1uaXRyb2dlbmlvX3RvdGFsDQogICAgKSAlPiUgDQogICMgZ3JvdXBfYnkoY29kaWdvKSAlPiUgDQogIHJlbmFtZSgNCiAgICANCiAgICBDRSA9IGNvbmR1dGl2aWRhZGUsDQogICAgRV9jb2xpID0gZXNjaGVyaWNoaWFfY29saSwNCiAgICBPRCA9IG94aWdlbmlvX2Rpc3NvbHZpZG8sDQogICAgU1QgPSBzb2xpZG9zX3RvdGFpcywNCiAgICBUdXJiID0gdHVyYmlkZXosDQogICAgVGVtcCA9IHRlbXBlcmF0dXJhX2FndWEsDQogICAgUHRvdCA9IGZvc2Zvcm9fdG90YWwsDQogICAgIyBOVG90ID0gbml0cm9nZW5pb190b3RhbCwNCiAgICBOQW1vbiA9IG5pdHJvZ2VuaW9fYW1vbmlhY2FsLA0KICAgIE5USyA9IG5pdHJvZ2VuaW9fa2plbGRhaGwNCiAgKSAlPiUgDQogIGdnY29ycigNCiAgICBtZXRob2QgPSAiY29tcGxldGUub2JzIiwNCiAgICAjICJwZWFyc29uIiwNCiAgICAjICJwYWlyd2lzZSIsDQogICAgbmFtZSA9ICJDb3JyZWxhw6fDo28iLA0KICAgIGxhYmVsID0gVFJVRSwNCiAgICBsYWJlbF9hbHBoYSA9IFRSVUUsDQogICAgZGlnaXRzID0gMywNCiAgICBsb3cgPSAiIzNCOUFCMiIsDQogICAgbWlkID0gIiNFRUVFRUUiLA0KICAgIGhpZ2ggPSAiI0YyMUEwMCIsDQogICAgIyBwYWxldHRlID0gIlJkWWxCdSIsDQogICAgbGF5b3V0LmV4cCA9IDAsDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImxlZnQiLA0KICAgIGxhYmVsX3JvdW5kID0gMywNCiAgICAjIGxlZ2VuZC5zaXplID0gMTgsDQogICAgZ2VvbSA9ICJ0aWxlIiwNCiAgICBuYnJlYWtzID0gMTAsDQogICkrDQogIGxhYnModGl0bGUgPSAiQ29ycmVsYcOnw6NvIGVudHJlIHBhcsOibWV0cm9zIGbDrXNpY28tcXXDrW1pY29zIG5hXG5CYWNpYSBIaWRyb2dyw6FmaWNhIGRvIHJpbyBHcmF2YXRhw60gbm8gcGVyw61vZG8gMTk5MC0yMDIwIikrDQogIHRoZW1lX2xpbmVkcmF3KCkrDQogIHRoZW1lKA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC4xNSwgMC42KSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLA0KICAgICMgbGVnZW5kLnNwYWNpbmcgPSB1bml0KGVsZW1lbnRfdGV4dCgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAjIHVuaXRzID0gNSkNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDE2KQ0KICApDQoNCiMgR3LDoWZpY28gZGFzIGNvcnJlbGHDp8O1ZXMgZW50cmUgdG9kb3Mgb3MgcGFyw6JtZXRyb3MgY29tIHNpZ25pZmljw6JuY2lhDQpjb3JyZWxfSVFBIDwtIHBhcmFtZXRyb3NfSVFBICU+JQ0KICBkcGx5cjo6c2VsZWN0KC1jb2RpZ28pICU+JQ0KICBnZ3BhaXJzKHRpdGxlID0gIkNvcnJlbGHDp8OjbyBlbnRyZSBwYXLDom1ldHJvcyBxdWUgY29tcMO1ZW0gbyBJUUEiLA0KICAgICAgICAgIGF4aXNMYWJlbHMgPSAic2hvdyIpDQoNCmNvcnJlbGFjYW9fcElRQSA8LSBwYXJhbWV0cm9zX0lRQSAlPiUgDQogIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICBjb3JyZWxhdGlvbjo6Y29ycmVsYXRpb24oKQ0KDQpjb3JyZWxhY2FvX3BJUUEgJT4lIA0KICAjIGdsaW1wc2UoKQ0KICBmaWx0ZXIoDQogICAgcCA8IDAuMDAxDQogICkgJT4lIA0KICB0KCkgJT4lIA0KICBzdW1tYXJ5KCkNCg0KcGFyYW1ldHJvc19JUUEgJT4lIA0KICAjIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICBkcGx5cjo6c2VsZWN0KA0KICAgIG5pdHJvZ2VuaW9fa2plbGRhaGwsIGNvbmR1dGl2aWRhZGUNCiAgKSAlPiUgDQogICMgY29ycmVsYXRpb246OmNvcl90ZXN0KCkgJT4lIA0KICBwbG90KCkNCg0KYGBgDQoNCiMjIyBDb25kdXRpdmlkYWRlIGVsw6l0cmljYQ0KDQpgYGB7ciBHcsOhZmljbyBjb25kX2VsZXQgZmFjZXR0ZWQsIGZpZy5jYXA9ImNvbmR1dGl2aWRhZGUtZWxldHJpY2EtZ3JhdmF0YcOtIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGNvbmRfZWxldCA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwLA0KICAgICAgICAgICAgICAgICAgICAgICAgYWVzKGNvZGlnbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kdXRpdmlkYWRlKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTAwLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD01MDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfc3VtbWFyeSgNCiAgICAgZnVuLmRhdGEgPSBmLA0KICAgICBnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgd2lkdGggPSAwLjMsDQogICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICkrDQogICBzdGF0X3N1bW1hcnkoDQogICAgIGZ1bi5kYXRhID0gZiwNCiAgICAgZ2VvbSA9ICJib3hwbG90IiwNCiAgICAgd2lkdGggPSAwLjcsDQogICAgIGZpbGwgPSAnI0Y4RjhGRicsDQogICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICApKw0KICAgZmFjZXRfd3JhcCh+cGVyaW9kbykrDQogICAgICBsYWJzKHRpdGxlID0gIkNvbmR1dGl2aWRhZGUgZWzDqXRyaWNhIG5vIHBlcsOtb2RvIDE5OTAtMjAyMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IsK1bWhvcy9jbSIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkY29uZHV0aXZpZGFkZSwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gY29uZF9lbGV0IHBlcmlvZG8xLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihjb25kX2VsZXRfcDEgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDEwIiksDQogICAgICAgICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmR1dGl2aWRhZGUpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTUwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICAgICBsYWJzKHRpdGxlID0gIkNvbmR1dGl2aWRhZGUgZWzDqXRyaWNhIG5vIHBlcsOtb2RvIDE5OTAtMjAwMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IsK1bWhvcy9jbSIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkY29uZHV0aXZpZGFkZSwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gY29uZF9lbGV0IHBlcmlvZG8yLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihjb25kX2VsZXRfcDIgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDEwIiksDQogICAgICAgICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmR1dGl2aWRhZGUpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTUwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIkNvbmR1dGl2aWRhZGUgZWzDqXRyaWNhIG5vIHBlcsOtb2RvIDIwMDAtMjAxMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IsK1bWhvcy9jbSIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkY29uZHV0aXZpZGFkZSwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gY29uZF9lbGV0IHBlcmlvZG8zLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihjb25kX2VsZXRfcDMgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDIwIiksDQogICAgICAgICAgICAgICAgICAgICAgICBhZXMoY29kaWdvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmR1dGl2aWRhZGUpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTUwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIkNvbmR1dGl2aWRhZGUgZWzDqXRyaWNhIG5vIHBlcsOtb2RvIDIwMTAtMjAyMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IsK1bWhvcy9jbSIpKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkY29uZHV0aXZpZGFkZSwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICApKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gY29uZF9lbGV0IDMgcGVyaW9kb3MganVudG9zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ3JpZC5hcnJhbmdlKGNvbmRfZWxldF9wMSwgY29uZF9lbGV0X3AyLCBjb25kX2VsZXRfcDMsIG5jb2wgPSAzKQ0KYGBgDQoNCmBgYHtyIFN1bcOhcmlvIGNvbmRfZWxldCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHN1bV9jb25kX2VsZXRfcDEgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgc2VsZWN0KGNvZGlnbywgY29uZHV0aXZpZGFkZSwgYW5vX2NvbGV0YSkgJT4lIA0KICAgZmlsdGVyKGFub19jb2xldGE+IjE5OTAiICYNCiAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoY29kaWdvKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihjb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgcTEgPSANCiAgICAgICBxdWFudGlsZShjb25kdXRpdmlkYWRlLCAwLjI1LCANCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWRpYW4gPSANCiAgICAgICBtZWRpYW4oY29uZHV0aXZpZGFkZSwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKGNvbmR1dGl2aWRhZGUsIA0KICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICBxMyA9IA0KICAgICAgIHF1YW50aWxlKGNvbmR1dGl2aWRhZGUsIDAuNzUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1heCA9IA0KICAgICAgIG1heChjb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9jb25kX2VsZXRfcDIgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChjb2RpZ28sIGNvbmR1dGl2aWRhZGUsIGFub19jb2xldGEpICU+JSANCiAgICBmaWx0ZXIoYW5vX2NvbGV0YT4iMjAwMCIgJg0KICAgICAgICAgICAgIGFub19jb2xldGE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KGNvZGlnbykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oY29uZHV0aXZpZGFkZSwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUoY29uZHV0aXZpZGFkZSwgMC4yNSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKGNvbmR1dGl2aWRhZGUsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihjb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZShjb25kdXRpdmlkYWRlLCAwLjc1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgoY29uZHV0aXZpZGFkZSwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX2NvbmRfZWxldF9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KGNvZGlnbywgY29uZHV0aXZpZGFkZSwgYW5vX2NvbGV0YSkgJT4lIA0KICAgIGZpbHRlcihhbm9fY29sZXRhPiIyMDEwIiAmDQogICAgICAgICAgICAgYW5vX2NvbGV0YTw9IjIwMjAiKSAlPiUgDQogICAgZ3JvdXBfYnkoY29kaWdvKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihjb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShjb25kdXRpdmlkYWRlLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oY29uZHV0aXZpZGFkZSwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKGNvbmR1dGl2aWRhZGUsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKGNvbmR1dGl2aWRhZGUsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChjb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBuID0gDQogICAgICAgIGxlbmd0aChjb25kdXRpdmlkYWRlKSkNCikNCg0KIyBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KIyAgICBzZWxlY3QoY29kaWdvLCBJUUEpICU+JSANCiMgICAgZ3JvdXBfYnkoY29kaWdvKSAlPiUgDQojICAgIHN1bW1hcml6ZSgNCiMgICAgICAgbWluID0gDQojICAgICAgICAgIG1pbihJUUEsIA0KIyAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICAgcTEgPSANCiMgICAgICAgICAgcXVhbnRpbGUoSVFBLCAwLjI1LCANCiMgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICAgbWVkaWFuID0gDQojICAgICAgICAgIG1lZGlhbihJUUEsIA0KIyAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICAgbWVhbiA9IA0KIyAgICAgICAgICBtZWFuKElRQSwgDQojICAgICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KIyAgICAgICBxMyA9IA0KIyAgICAgICAgICBxdWFudGlsZShJUUEsIDAuNzUsIA0KIyAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KIyAgICAgICBtYXggPSANCiMgICAgICAgICAgbWF4KElRQSwgDQojICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIGNvbmRfZWxldCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KZ2dzYXZlKCJjb25kX2VsZXQucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGNvbmRfZWxldCwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJjb25kX2VsZXRfcDEucG5nIiwNCiAgICAgICBwbG90ID0gY29uZF9lbGV0X3AxLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImNvbmRfZWxldF9wMi5wbmciLA0KICAgICAgIHBsb3QgPSBjb25kX2VsZXRfcDIsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiY29uZF9lbGV0X3AzLnBuZyIsDQogICAgICAgcGxvdCA9IGNvbmRfZWxldF9wMywNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJjb25kX2VsZXRfM3BlcmlvZG9zLnBuZyIsDQogICAgICAgdW5pdHMgPSBjKCJweCIpLA0KICAgICAgIHdpZHRoID0gNDUwMCwNCiAgICAgICBoZWlnaHQgPSAyOTkzLA0KICAgICAgIHBsb3QgPSBncmlkLmFycmFuZ2UoY29uZF9lbGV0X3AxLCBjb25kX2VsZXRfcDIsIGNvbmRfZWxldF9wMywgbmNvbCA9IDMpLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpgYGANCg0KIyMgVGV4dGFuZG8gbyB0ZXh0bw0KDQotICAgwqcgZmFsYXIgZG8gY29tcG9ydGFtZW50byBnZXJhbCBkb3MgZGFkb3MNCi0gICAywrogwqcgLSB4wrogwqcgLVw+IGFib3JkYXIgb3MgcHJpbmNpcGFpcyBwYXLDom1ldHJvcyBxdWUgZXN0w6NvIHNlbmRvIGltcGFjdGFkb3MsIGRldGFsaGFuZG8sIG5hcyBlc3Rhw6fDtWVzIG1haXMgcmVsZXZhbnRlcywgY29tbyBmaWNhcmFtIG9zIHF1YXJ0aXMvbWVkaWFuYSBldGMuDQoNCmByIHN1bV9vZF9wMSRQTTFbMV1gDQoNCk9zIHJlc3VsdGFkb3MgYXBvbnRhbSBxdWUgcGFyYSBvIHBhcsOibWV0cm8gT0QNCg0KDQojIyBHcsOhZmljb3MgZXhlbXBsb3MgYm94cGxvdA0KYGBge3IgZWxlbWVudG9zIGRvIGJveHBsb3R9DQpzZXQuc2VlZCgyMDIzKQ0KZXhlbXBsb19ib3hwbG90X2RmIDwtIGRhdGEuZnJhbWUoDQogIFBNID0gYygiUE0xIiksDQogICMgbGV0cmFzID0gbGV0dGVyc1tzZXEoIGZyb20gPSAxLCB0byA9IDEgKV0sDQogIFN0YXQxID0gcm5vcm0oMTAwLCANCiAgICAgICAgICAgICAgICBtZWFuID0gNSwgDQogICAgICAgICAgICAgICAgc2QgPSAxLjgpDQopDQoNCihzdW1hcmlvX2V4ZW1wbG9fYnAgPC0gZXhlbXBsb19ib3hwbG90X2RmICU+JSANCiAgICBncm91cF9ieShQTSkgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1heCA9IG1heChTdGF0MSksDQogICAgICBwOTUgPSBxdWFudGlsZShTdGF0MSwgMC45NSksDQogICAgICBwODAgPSBxdWFudGlsZShTdGF0MSwgMC44KSwNCiAgICAgIG1lZGlhbiA9IG1lZGlhbihTdGF0MSksDQogICAgICBwMjAgPSBxdWFudGlsZShTdGF0MSwgMC4yKSwNCiAgICAgIHAwNSA9IHF1YW50aWxlKFN0YXQxLCAwLjA1KSwNCiAgICAgIG1pbiA9IG1pbihTdGF0MSksDQogICAgKSAlPiUgDQogICAgdCgpICU+JSANCiAgICByb3dfdG9fbmFtZXMocm93X251bWJlciA9IDEpICU+JSANCiAgICBhcy5udW1lcmljKCkNCikNCg0KDQooYm94cGxvdF9leGFtcGxlIDwtIGV4ZW1wbG9fYm94cGxvdF9kZiAlPiUgDQogICAgZ2dwbG90KA0KICAgICAgYWVzKA0KICAgICAgICB4ID0gUE0sDQogICAgICAgIHkgPSBTdGF0MSwNCiAgICAgICkNCiAgICApKw0KICAgIHN0YXRfc3VtbWFyeSgNCiAgICAgIGZ1bi5kYXRhID0gZiwNCiAgICAgIGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgd2lkdGggPSAwLjE1LA0KICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgICkrDQogICAgc3RhdF9zdW1tYXJ5KA0KICAgICAgZnVuLmRhdGEgPSBmLA0KICAgICAgZ2VvbSA9ICJib3hwbG90IiwNCiAgICAgIHdpZHRoID0gMC40MCwNCiAgICAgIGZpbGwgPSAnI0Y4RjhGRicsDQogICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICApKw0KICAgIGxhYnMoDQogICAgICB0aXRsZSA9ICJFbGVtZW50b3MgZG8gKmJveHBsb3QqIiwNCiAgICAgIHg9IE5VTEwsDQogICAgICB5PSBOVUxMDQogICAgKSsNCiAgICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICAgc2l6ZSA9IDEuNCwNCiAgICAgIGFscGhhID0gLjMsDQogICAgICB3aWR0aCA9IC4wNywNCiAgICApKw0KICAgIHNjYWxlX3lfY29udGludW91cygNCiAgICAgIGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgIGxpbWl0cyA9IGMoLTAuMywxMikNCiAgICApKw0KICAgIGFubm90YXRlKA0KICAgICAgZ2VvbSA9ICJ0ZXh0IiwNCiAgICAgIHggPSAxLjU1LA0KICAgICAgaGp1c3QgPSAicmlnaHQiLA0KICAgICAgeSA9IHN1bWFyaW9fZXhlbXBsb19icCwNCiAgICAgIGxhYmVsID0gYygiVmFsb3IgbcOheGltbyIsICJQOTUiLCAiUDgwIiwgIk1lZGlhbmEiLCAiUDIwIiwgIlAwNSIsICJWYWxvciBtw61uaW1vIiksDQogICAgICAjIGZvbnRmYWNlID0gMw0KICAgICkrDQogICAgZ2VvbV9yaWNodGV4dCgNCiAgICAgIHggPSAwLjU2LA0KICAgICAgeSA9IDkuMTAzOTk4LA0KICAgICAgbGFiZWwuY29sb3IgPSBOQSwNCiAgICAgIGhqdXN0ID0gImNlbnRlciIsDQogICAgICBsYWJlbCA9ICI8aT5PdXRsaWVyczwvaT4iDQogICAgKSsNCiAgICBnZW9tX2N1cnZlKA0KICAgICAgYWVzKA0KICAgICAgICB4ID0gMC42LCB4ZW5kID0gMC45OCwNCiAgICAgICAgeSA9IDkuMTAzOTk4ICwgeWVuZCA9IDkuMTAzOTk4ICwgI091dGxpZXJzDQogICAgICApLA0KICAgICAgY3VydmF0dXJlID0gMCwNCiAgICAgIHNpemUgPSAxLjAsDQogICAgICBhcnJvdyA9IGFycm93KGxlbmd0aCA9IHVuaXQoMC4wNSwgIm5wYyIpKSwNCiAgICAgIGxpbmVlbmQgPSAicm91bmQiDQogICAgKSsNCiAgICAjZGVmaW5pbmRvIG8gWw0KICAgIGdlb21fY3VydmUoDQogICAgICBhZXMoDQogICAgICAgIHggPSAwLjc0LCB4ZW5kID0gMC43OCwNCiAgICAgICAgeSA9IDYuNjgzODI4LCB5ZW5kID0gNi42ODM4MjgsDQogICAgICApLA0KICAgICAgY3VydmF0dXJlID0gMCwNCiAgICAgIHNpemUgPSAxLjAsDQogICAgICBsaW5lZW5kID0gImJ1dHQiDQogICAgKSsNCiAgICBnZW9tX2N1cnZlKA0KICAgICAgYWVzKA0KICAgICAgICB4ID0gMC43NCwgeGVuZCA9IDAuNzQsDQogICAgICAgIHkgPSAzLjU0NTc3MSwgeWVuZCA9IDYuNjgzODI4LA0KICAgICAgKSwNCiAgICAgIGN1cnZhdHVyZSA9IDAsDQogICAgICBzaXplID0gMS4wLA0KICAgICAgbGluZWVuZCA9ICJidXR0Ig0KICAgICkrDQogICAgYW5ub3RhdGUoDQogICAgICBnZW9tID0gInRleHQiLA0KICAgICAgeCA9IDAuNTYsDQogICAgICBoanVzdCA9ICJjZW50ZXIiLA0KICAgICAgeSA9IDUuMTEsDQogICAgICBsYWJlbCA9ICJBbXBsaXR1ZGVcbihQODAtUDIwKSINCiAgICApKw0KICAgIGdlb21fY3VydmUoDQogICAgICBhZXMoDQogICAgICAgIHggPSAwLjc0LCB4ZW5kID0gMC43OCwNCiAgICAgICAgeSA9IDMuNTQ1NzcxICwgeWVuZCA9IDMuNTQ1NzcxICwNCiAgICAgICksDQogICAgICBjdXJ2YXR1cmUgPSAwLA0KICAgICAgc2l6ZSA9IDEuMCwNCiAgICAgIGxpbmVlbmQgPSAiYnV0dCINCiAgICApKw0KICAgICMgZmltIGRvIFsNCiAgICBnZW9tX2N1cnZlKA0KICAgICAgYWVzKA0KICAgICAgICB4ID0gMC42LCB4ZW5kID0gMC45MCwNCiAgICAgICAgeSA9IDcuODY2OTI3ICwgeWVuZCA9IDcuODY2OTI3ICwgI3doaXNrZXIgc3VwZXJpb3INCiAgICAgICksDQogICAgICBjdXJ2YXR1cmUgPSAwLA0KICAgICAgc2l6ZSA9IDEuMCwNCiAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjA1LCAibnBjIikpLA0KICAgICAgbGluZWVuZCA9ICJyb3VuZCINCiAgICApKw0KICAgIGFubm90YXRlKA0KICAgICAgZ2VvbSA9ICJ0ZXh0IiwNCiAgICAgIHggPSAwLjU2LA0KICAgICAgaGp1c3QgPSAiY2VudGVyIiwNCiAgICAgIHkgPSA3Ljg2NjkyNywNCiAgICAgIGxhYmVsID0gIldoaXNrZXJcbnN1cGVyaW9yIg0KICAgICkrDQogICAgZ2VvbV9jdXJ2ZSgNCiAgICAgIGFlcygNCiAgICAgICAgeCA9IDAuNiwgeGVuZCA9IDAuOTAsDQogICAgICAgIHkgPSAyLjI3NzEwNCAgLCB5ZW5kID0gMi4yNzcxMDQgICwgI3doaXNrZXIgaW5mZXJpb3INCiAgICAgICksDQogICAgICBjdXJ2YXR1cmUgPSAwLA0KICAgICAgc2l6ZSA9IDEuMCwNCiAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjA1LCAibnBjIikpLA0KICAgICAgbGluZWVuZCA9ICJyb3VuZCINCiAgICApKw0KICAgIGFubm90YXRlKA0KICAgICAgZ2VvbSA9ICJ0ZXh0IiwNCiAgICAgIHggPSAwLjU2LA0KICAgICAgaGp1c3QgPSAiY2VudGVyIiwNCiAgICAgIHkgPSAyLjI3NzEwNCwNCiAgICAgIGxhYmVsID0gIldoaXNrZXJcbmluZmVyaW9yIg0KICAgICkrDQogICAgZ2VvbV9jdXJ2ZSgNCiAgICAgIGFlcygNCiAgICAgICAgeCA9IDEuNCwgeGVuZCA9IDEuMDEsDQogICAgICAgIHkgPSA5LjkyMzQzLCB5ZW5kID0gOS45MjM0MywgI3ZhbG9yIG3DoXhpbW8NCiAgICAgICksDQogICAgICBjdXJ2YXR1cmUgPSAwLA0KICAgICAgc2l6ZSA9IDEuMCwNCiAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjA1LCAibnBjIikpLA0KICAgICAgbGluZWVuZCA9ICJyb3VuZCINCiAgICApKw0KICAgIGdlb21fY3VydmUoDQogICAgICBhZXMoDQogICAgICAgIHggPSAxLjQ1LCB4ZW5kID0gMS4xMSwNCiAgICAgICAgeSA9IDcuODY2OTI3ICwgeWVuZCA9IDcuODY2OTI3ICwgI1A5NQ0KICAgICAgKSwNCiAgICAgIGN1cnZhdHVyZSA9IDAsDQogICAgICBzaXplID0gMS4wLA0KICAgICAgYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDAuMDUsICJucGMiKSksDQogICAgICBsaW5lZW5kID0gInJvdW5kIg0KICAgICkrDQogICAgZ2VvbV9jdXJ2ZSgNCiAgICAgIGFlcygNCiAgICAgICAgeCA9IDEuNDUsIHhlbmQgPSAxLjIyLA0KICAgICAgICB5ID0gNi42ODM4MjggICwgeWVuZCA9IDYuNjgzODI4ICAsICNQODANCiAgICAgICksDQogICAgICBjdXJ2YXR1cmUgPSAwLA0KICAgICAgc2l6ZSA9IDEuMCwNCiAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjA1LCAibnBjIikpLA0KICAgICAgbGluZWVuZCA9ICJyb3VuZCINCiAgICApKw0KICAgIGdlb21fY3VydmUoDQogICAgICBhZXMoDQogICAgICAgIHggPSAxLjQ1LCB4ZW5kID0gMS4yMiwNCiAgICAgICAgeSA9IDQuODg2OTM1ICAgLCB5ZW5kID0gNC44ODY5MzUgICAsICNQNTANCiAgICAgICksDQogICAgICBjdXJ2YXR1cmUgPSAwLA0KICAgICAgc2l6ZSA9IDEuMCwNCiAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjA1LCAibnBjIikpLA0KICAgICAgbGluZWVuZCA9ICJyb3VuZCINCiAgICApKw0KICAgIGdlb21fY3VydmUoDQogICAgICBhZXMoDQogICAgICAgIHggPSAxLjQ1LCB4ZW5kID0gMS4yMiwNCiAgICAgICAgeSA9IDMuNTQ1NzcxLCB5ZW5kID0gMy41NDU3NzEsICNQMjANCiAgICAgICksDQogICAgICBjdXJ2YXR1cmUgPSAwLA0KICAgICAgc2l6ZSA9IDEuMCwNCiAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjA1LCAibnBjIikpLA0KICAgICAgbGluZWVuZCA9ICJyb3VuZCINCiAgICApKw0KICAgIGdlb21fY3VydmUoDQogICAgICBhZXMoDQogICAgICAgIHggPSAxLjQ1LCB4ZW5kID0gMS4xMSwNCiAgICAgICAgeSA9IDIuMjc3MTA0LCB5ZW5kID0gMi4yNzcxMDQsICNQMDUNCiAgICAgICksDQogICAgICBjdXJ2YXR1cmUgPSAwLA0KICAgICAgc2l6ZSA9IDEuMCwNCiAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjA1LCAibnBjIikpLA0KICAgICAgbGluZWVuZCA9ICJyb3VuZCINCiAgICApKw0KICAgIGdlb21fY3VydmUoDQogICAgICBhZXMoDQogICAgICAgIHggPSAxLjQsIHhlbmQgPSAxLjAxLA0KICAgICAgICB5ID0gMS4yODIxNzcsIHllbmQgPSAxLjI4MjE3NywgI3ZhbG9yIG3DrW5pbW8NCiAgICAgICksDQogICAgICBjdXJ2YXR1cmUgPSAwLA0KICAgICAgc2l6ZSA9IDEuMCwNCiAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgwLjA1LCAibnBjIikpLA0KICAgICAgbGluZWVuZCA9ICJyb3VuZCINCiAgICApKw0KICAgICMgdGhlbWVfZ3JhZnMoKSsNCiAgICB0aGVtZV9idygpKw0KICAgIHRoZW1lKA0KICAgICAgcGxvdC50aXRsZSA9IA0KICAgICAgICBlbGVtZW50X21hcmtkb3duKA0KICAgICAgICAgIGhqdXN0ID0gMC41LA0KICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgICAgICBzaXplID0gMTkpLA0KICAgICkNCikNCmBgYA0KDQpgYGB7ciBzYWx2YW5kbyBncmFmIGVsZW1lbnRvcyBib3hwbG90fQ0KZ2dzYXZlKA0KICBmaWxlbmFtZSA9ICJleGVtcGxvX2JveHBsb3QucG5nIiwNCiAgcGxvdCA9IGJveHBsb3RfZXhhbXBsZSwNCiAgdW5pdHMgPSBjKCJweCIpLA0KICB3aWR0aCA9ICg0NTAwKS8xLjUsDQogIGhlaWdodCA9ICgyOTkzKS8xLjUsDQogIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogIGRwaSA9IDMwMCwNCiAgIyB0eXBlID0gImNhaXJvIg0KKQ0KYGBgDQoNCg0KYGBge3IgY3JpYW5kbyBleGVtcGxvIHRpcG9zIGJveHBsb3QgdHVrZXkgeCBnYXJyZXR0fQ0Kc2V0LnNlZWQoMjAyMSkNCg0KZGF0YSA8LSB0aWJibGUoDQogIGdydXBvID0gZmFjdG9yKA0KICAgIGMocmVwKA0KICAgICAgIkdydXBvIDEiLCAxMDApLCANCiAgICAgIHJlcCgiR3J1cG8gMiIsIDI1MCksIA0KICAgICAgcmVwKCJHcnVwbyAzIiwgMjUpDQogICAgKQ0KICApLA0KICB2YWxvciA9IGMoc2VxKDAsIDIwLCBsZW5ndGgub3V0ID0gMTAwKSwNCiAgICAgICAgICAgIGMocmVwKDAsIDUpLCANCiAgICAgICAgICAgICAgcm5vcm0oMzAsIDIsIC4xKSwgDQogICAgICAgICAgICAgIHJub3JtKDkwLCA1LjQsIC4xKSwgDQogICAgICAgICAgICAgIHJub3JtKDkwLCAxNC42LCAuMSksIA0KICAgICAgICAgICAgICBybm9ybSgzMCwgMTgsIC4xKSwgDQogICAgICAgICAgICAgIHJlcCgyMCwgNSkNCiAgICAgICAgICAgICksDQogICAgICAgICAgICByZXAoc2VxKDAsIDIwLCBsZW5ndGgub3V0ID0gNSksIDUpKQ0KKSAlPiUgDQogIHJvd3dpc2UoKSAlPiUNCiAgbXV0YXRlKA0KICAgIHZhbG9yID0gaWZfZWxzZSgNCiAgICAgIGdydXBvID09ICJHcnVwbyAyIiwgdmFsb3IgKyBybm9ybSgxLCAwLCAuNCksIA0KICAgICAgdmFsb3INCiAgICAgICkNCiAgICApDQoNCiMjIGZ1bmN0aW9uIHRvIHJldHVybiBtZWRpYW4gYW5kIGxhYmVscw0Kbl9mdW4gPC0gZnVuY3Rpb24oeCl7DQogIHJldHVybigNCiAgICBkYXRhLmZyYW1lKA0KICAgICAgeSA9IG1lZGlhbih4KSAtIDEuMjUsIA0KICAgICAgbGFiZWwgPSBwYXN0ZTAoDQogICAgICAgICJuID0gIixsZW5ndGgoeCkNCiAgICAgICkNCiAgICApDQogICkNCn0NCmBgYA0KDQpgYGB7ciB0dWtleSBib3hwbG90fQ0KKHR1a2V5X25fYm94cGxvdCA8LSBnZ3Bsb3QoZGF0YSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGdydXBvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gdmFsb3IpDQopKw0KICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICB3aWR0aCA9IDAuMTUsDQogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9ICJncmV5OTIiLA0KICAgICAgICAgICAgICAgd2lkdGggPSAwLjQwLA0KICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIyMgdXNlIHN1bW1hcnkgZnVuY3Rpb24gdG8gYWRkIHRleHQgbGFiZWxzDQogIHN0YXRfc3VtbWFyeSgNCiAgICBnZW9tID0gInRleHQiLA0KICAgIGZ1bi5kYXRhID0gbl9mdW4sDQogICAgIyBmYW1pbHkgPSAiT3N3YWxkIiwNCiAgICBzaXplID0gNQ0KICApKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlR1a2V5ICpib3hwbG90KiIsDQogICAgeD0gTlVMTCwNCiAgICAjIHk9Im1nL0wiDQogICkrDQogICMgdGhlbWVfZ3JhZnMoKSsNCiAgdGhlbWVfYncoKSsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoDQogICAgICBhbmdsZSA9IDkwLCANCiAgICAgICMgc2l6ZT0xNSwNCiAgICAgICMgZmFjZT0yDQogICAgKSwNCiAgICBwbG90LnRpdGxlID0gDQogICAgICBlbGVtZW50X21hcmtkb3duKA0KICAgICAgICBoanVzdCA9IDAuNSwNCiAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICBzaXplID0gMTkpDQogICkNCikNCg0KDQoodHVrZXlfYm94cGxvdCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBncnVwbywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB2YWxvcikpICsNCiAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgd2lkdGggPSAwLjE1LA0KICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiZ3JleTkyIiwNCiAgICAgICAgICAgICAgIHdpZHRoID0gMC40MCwNCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkgKw0KICAjIyB1c2UgZWl0aGVyIGdlb21fcG9pbnQoKSBvciBnZW9tX2ppdHRlcigpDQogIGdlb21fcG9pbnQoDQogICAgIyMgZHJhdyBiaWdnZXIgcG9pbnRzDQogICAgc2l6ZSA9IDIsDQogICAgIyMgYWRkIHNvbWUgdHJhbnNwYXJlbmN5DQogICAgYWxwaGEgPSAuMjUsDQogICAgIyMgYWRkIHNvbWUgaml0dGVyaW5nDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoDQogICAgICAjIyBjb250cm9sIHJhbmRvbW5lc3MgYW5kIHJhbmdlIG9mIGppdHRlcg0KICAgICAgc2VlZCA9IDEsIHdpZHRoID0gLjINCiAgICApDQogICkrDQogIHRoZW1lX2J3KCkrDQogIGxhYnMoDQogICAgICB0aXRsZSA9ICJUdWtleSAqYm94cGxvdCoiLA0KICAgICAgeD0gTlVMTCwNCiAgICAgICMgeT0ibWcvTCINCiAgICApKw0KICAjIHRoZW1lX2dyYWZzKCkrDQogIHRoZW1lX2J3KCkrDQogIHRoZW1lKA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCgNCiAgICAgICAgICBhbmdsZSA9IDkwLCANCiAgICAgICAgICAjIHNpemU9MTUsDQogICAgICAgICAgIyBmYWNlPTINCiAgICAgICAgKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IA0KICAgICAgICAgIGVsZW1lbnRfbWFya2Rvd24oDQogICAgICAgICAgICBoanVzdCA9IDAuNSwNCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgICAgICAgIHNpemUgPSAxOSkNCiAgICApKQ0KYGBgDQoNCmBgYHtyIGdhcnJldHQgYm94cGxvdH0NCmRhdGEgJT4lIA0KICBncm91cF9ieShncnVwbykgJT4lIA0KICBzdW1tYXJpemUoDQogICAgbWluID0gbWluKHZhbG9yKSwNCiAgICBQMjAgPSBxdWFudGlsZSh2YWxvciwgMC4yMCksDQogICAgcTEgPSBxdWFudGlsZSh2YWxvciwgMC4yNSksDQogICAgbWVkaWFuYSA9IG1lZGlhbih2YWxvciksDQogICAgcTMgPSBxdWFudGlsZSh2YWxvciwgMC43NSksDQogICAgUDgwID0gcXVhbnRpbGUodmFsb3IsIDAuODApLA0KICAgIG1heCA9IG1heCh2YWxvcikNCiAgKSAlPiUgDQogIHQoKSAlPiUgDQogIHJvd190b19uYW1lcyhyb3dfbnVtYmVyID0gMSkNCiAgDQogIA0KKGJveF9wZXJjZW50aWxlX3Bsb3QgPC0gZ2dwbG90KGRhdGEsIA0KICAgICAgIGFlcyh4ID0gZ3J1cG8sIHkgPSB2YWxvcikNCiAgICAgICApICsNCiAgICAgIHN0YXRfc3VtbWFyeSgNCiAgICAgICAgZnVuLmRhdGEgPSBmLA0KICAgICAgICBnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgd2lkdGggPSAwLjE1LA0KICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICApKw0KICAgICAgc3RhdF9zdW1tYXJ5KA0KICAgICAgICBmdW4uZGF0YSA9IGYsDQogICAgICAgIGdlb20gPSAiYm94cGxvdCIsDQogICAgICAgIHdpZHRoID0gMC40MCwNCiAgICAgICAgZmlsbCA9ICdncmV5OTInLA0KICAgICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgKSsNCiAgIyBnZW9tX2JveHBsb3QoZmlsbCA9ICJncmV5OTIiKSArDQogICMjIHVzZSBlaXRoZXIgZ2VvbV9wb2ludCgpIG9yIGdlb21faml0dGVyKCkNCiAgZ2VvbV9wb2ludCgNCiAgICAjIyBkcmF3IGJpZ2dlciBwb2ludHMNCiAgICBzaXplID0gMiwNCiAgICAjIyBhZGQgc29tZSB0cmFuc3BhcmVuY3kNCiAgICBhbHBoYSA9IC4yNSwNCiAgICAjIyBhZGQgc29tZSBqaXR0ZXJpbmcNCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigNCiAgICAgICMjIGNvbnRyb2wgcmFuZG9tbmVzcyBhbmQgcmFuZ2Ugb2Ygaml0dGVyDQogICAgICBzZWVkID0gMSwgd2lkdGggPSAuMg0KICAgICkNCiAgKSsNCiAgbGFicygNCiAgICAgIHRpdGxlID0gIipCb3ggUGVyY2VudGlsZS1QbG90KiIsDQogICAgICB4PSBOVUxMLA0KICAgICAgIyB5PSJtZy9MIg0KICAgICkrDQogICMgdGhlbWVfZ3JhZnMoKSsNCiAgdGhlbWVfYncoKSsNCiAgdGhlbWUoDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KA0KICAgICAgICAgIGFuZ2xlID0gOTAsIA0KICAgICAgICAgICMgc2l6ZSA9IDE1LA0KICAgICAgICAgICMgZmFjZSA9IDINCiAgICAgICAgKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IA0KICAgICAgICAgIGVsZW1lbnRfbWFya2Rvd24oDQogICAgICAgICAgICBoanVzdCA9IDAuNSwNCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgICAgICAgIHNpemUgPSAxOSkNCiAgICApDQogICkNCmdyaWQuYXJyYW5nZSgNCiAgdHVrZXlfYm94cGxvdCwgYm94X3BlcmNlbnRpbGVfcGxvdCwgDQogIG5jb2wgPSAyDQogICkNCmZpZ190dWtleV9nYXJyZXR0IDwtIHBsb3RfZ3JpZCh0dWtleV9ib3hwbG90LCBib3hfcGVyY2VudGlsZV9wbG90LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIpDQpgYGANCg0KYGBge3Igc2FsdmFuZG8gZ3JhZiBleGVtcGxvIGJveHBsb3R9DQpnZ3NhdmUoDQogIGZpbGVuYW1lID0gInR1a2V5X25fYm94cGxvdC5wbmciLA0KICBwbG90ID0gdHVrZXlfbl9ib3hwbG90LA0KICB1bml0cyA9IGMoInB4IiksDQogIHdpZHRoID0gNDUwMCwNCiAgaGVpZ2h0ID0gMjk5MywNCiAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgZHBpID0gMzAwLA0KICAjIHR5cGUgPSAiY2Fpcm8iDQopDQoNCmdnc2F2ZSgNCiAgZmlsZW5hbWUgPSAidHVrZXlfYm94cGxvdC5wbmciLA0KICBwbG90ID0gdHVrZXlfYm94cGxvdCwNCiAgdW5pdHMgPSBjKCJweCIpLA0KICB3aWR0aCA9IDQ1MDAsDQogIGhlaWdodCA9IDI5OTMsDQogIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogIGRwaSA9IDMwMCwNCiAgIyB0eXBlID0gImNhaXJvIg0KKQ0KDQpnZ3NhdmUoDQogIGZpbGVuYW1lID0gImJveF9wZXJjZW50aWxlX3Bsb3QucG5nIiwNCiAgcGxvdCA9IGJveF9wZXJjZW50aWxlX3Bsb3QsDQogIHVuaXRzID0gYygicHgiKSwNCiAgd2lkdGggPSA0NTAwLA0KICBoZWlnaHQgPSAyOTkzLA0KICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICBkcGkgPSAzMDAsDQogICMgdHlwZSA9ICJjYWlybyINCikNCg0KZ2dzYXZlKA0KICBmaWxlbmFtZSA9ICJmaWdfdHVrZXlfZ2FycmV0dC5wbmciLA0KICBwbG90ID0gZmlnX3R1a2V5X2dhcnJldHQsDQogIHVuaXRzID0gYygicHgiKSwNCiAgd2lkdGggPSA0NTAwLA0KICBoZWlnaHQgPSAyOTkzLA0KICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICBkcGkgPSAzMDAsDQogICMgdHlwZSA9ICJjYWlybyINCikNCmBgYA0K